ソースを参照

Merge branch 'develop' of http://code.dashoo.cn/chengjian/opms_backend into develop

liuyaqi 2 年 前
コミット
3246315c34

+ 19 - 0
opms_parent/app/handler/home/home.go

@@ -109,3 +109,22 @@ func (h *HomeHandler) GetSalesEngineerFollowUpNum(ctx context.Context, req *mode
 	rsp.Data = resp
 	return nil
 }
+
+// GetPunchRecordsNum 打卡记录数据统计
+func (h *HomeHandler) GetPunchRecordsNum(ctx context.Context, req *model.SearchPunchRecordsData, rsp *comm_def.CommonMsg) error {
+	svc, err := service.NewHomeService(ctx)
+	if err != nil {
+		return err
+	}
+	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
+		return err
+	}
+	resp, err := svc.QueryPunchRecordsNum(req.Month)
+	if err != nil {
+		return err
+	}
+	rsp.Code = 200
+	rsp.Msg = "查询成功"
+	rsp.Data = resp
+	return nil
+}

+ 4 - 0
opms_parent/app/model/home/home.go

@@ -69,3 +69,7 @@ type SearchWechatNumReportDataRes struct {
 type SearchFollowUpReportData struct {
 	Month *gtime.Time `json:"month" v:"required#月份不能为空"`
 }
+
+type SearchPunchRecordsData struct {
+	Month *gtime.Time `json:"month" v:"required#月份不能为空"`
+}

+ 68 - 0
opms_parent/app/service/home/report.go

@@ -787,6 +787,58 @@ func (s *HomeService) QuerySalesEngineerFollowUpNum(day *gtime.Time) (interface{
 	return g.Map{"header": header, "data": data}, nil
 }
 
+type PunchRecordsCount struct {
+	UserId       int    `json:"userId"`
+	UserNickName string `json:"userNickName"`
+	PunchType    string `json:"punchType"`
+	Count        int    `json:"count"`
+}
+
+// QueryPunchRecordsNum 打卡记录数据统计
+func (s *HomeService) QueryPunchRecordsNum(day *gtime.Time) (interface{}, error) {
+	weekData := GetMonthWeekDay(day)
+	punchRecordsDao := platDao.NewPlatPunchRecordsDao(s.Tenant)
+	punchRecordsMonthData := make([][]PunchRecordsCount, 0)
+	for _, item := range weekData {
+		data := make([]PunchRecordsCount, 0)
+		err := punchRecordsDao.Fields("user_id, user_nick_name, punch_type, COUNT(id) as count").
+			WhereGTE(punchRecordsDao.C.PunchTime, item[0]).WhereLTE(punchRecordsDao.C.PunchTime, item[1]).
+			Group("user_id, punch_type").Order("user_id ASC, punch_type ASC").Scan(&data)
+		if err != nil {
+			return nil, err
+		}
+		punchRecordsMonthData = append(punchRecordsMonthData, data)
+	}
+	// 409022238
+	userList, err := service.GetUsersByRoleCode(s.Ctx, []string{"SalesEngineer", "ProductLineManager"}, 100)
+	if err != nil {
+		return nil, err
+	}
+	// 打卡类型(10居家20客户30经销商40代理商)
+	var punchTypes = []string{"10", "20", "30", "40"}
+	var punchTypeNames = []string{"居家", "客户", "经销商", "代理商"}
+	header, data := make([]g.Map, 0), make([]g.Map, 0)
+	header = append(header, g.Map{"prop": "userName", "label": "销售工程师"})
+	header = append(header, g.Map{"prop": "punchType", "label": "打卡方式"})
+	for k, _ := range weekData {
+		header = append(header, g.Map{"prop": fmt.Sprintf("W%d", k+1), "label": fmt.Sprintf("第%d周", k+1)})
+	}
+	header = append(header, g.Map{"prop": "monthTotal", "label": "月度合计"})
+
+	// 打卡类型(10居家20客户30经销商40代理商)
+	for userName, id := range userList {
+		for index, key := range punchTypes {
+			data = append(data, punchRecordsDataConvert(g.Map{
+				"userName":     userName,
+				"userId":       id,
+				"punchTypeKey": key,
+				"punchType":    punchTypeNames[index],
+			}, punchRecordsMonthData))
+		}
+	}
+	return g.Map{"header": header, "data": data}, nil
+}
+
 func followUpReportDataConvert(data g.Map, followUpMonthData [][]FollowUpCount) g.Map {
 	var total int
 	for k, items := range followUpMonthData {
@@ -803,6 +855,22 @@ func followUpReportDataConvert(data g.Map, followUpMonthData [][]FollowUpCount)
 	return data
 }
 
+func punchRecordsDataConvert(data g.Map, punchRecordsCMonthData [][]PunchRecordsCount) g.Map {
+	var total int
+	for k, items := range punchRecordsCMonthData {
+		data[fmt.Sprintf("W%d", k+1)] = 0
+		for _, item := range items {
+			if item.UserId == data["userId"] && item.PunchType == data["punchTypeKey"] {
+				data[fmt.Sprintf("W%d", k+1)] = item.Count
+				total += item.Count
+				break
+			}
+		}
+	}
+	data["monthTotal"] = total
+	return data
+}
+
 // GetMonthWeekDay 获取月份下的每周日期
 func GetMonthWeekDay(day *gtime.Time) [][]*gtime.Time {
 	fmt.Println(day)

+ 24 - 11
opms_parent/app/service/work/deliver_order.go

@@ -96,24 +96,37 @@ func (s DeliverOrderService) Get(ctx context.Context, id int) (*work.DeliverOrde
 
 func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderListReq) (int, []*work.DeliverOrder, error) {
 	g.Log().Infof("DeliverOrderService List roles %v", s.userInfo.Roles)
-	dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("ctr_contract b", "a.contract_id=b.id").Unscoped().Where("a.deleted_time is null")
-	// 销售只能看自己所属的,其他人只能看自己所属产品线的 (大区经理有可能同时具有销售角色,这里需要排除大区经理)
-	if service.StringsContains(s.userInfo.Roles, "SalesEngineer") &&
-		!service.StringsContains(s.userInfo.Roles, "RegionalManager") {
-		dao = dao.Where("b.incharge_id = ?", s.userInfo.Id)
-		// } else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
-		// 	dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
-		//	项目经理、交付经理看自己的,研发主管、研发总监看全部的
+	//dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("ctr_contract b", "a.contract_id=b.id").Unscoped().Where("a.deleted_time is null") // 改为关联项目
+	dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("proj_business b", "a.project_id=b.id").Unscoped().Where("a.deleted_time is null")
+	//	系统管理员、研发主管、研发总监、品质主管、总经理、销售总监、销售助理看全部的
+	if service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentDirector") || service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentSupervisor") || service.StringsContains(s.userInfo.Roles, "QualityAssuranceSupervisor") || service.StringsContains(s.userInfo.Roles, "GeneralManager") || service.StringsContains(s.userInfo.Roles, "SalesDirector") || service.StringsContains(s.userInfo.Roles, "SaleAssociate") || service.StringsContains(s.userInfo.Roles, "SysAdmin") {
+		//	无条件,查询全部
+		//	项目经理看对应的
 	} else if service.StringsContains(s.userInfo.Roles, "ProjectManager") {
 		dao = dao.Where("a.project_man_id = ?", s.userInfo.Id)
+		//	交付经理看对应的
 	} else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
 		dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
-	} else if service.StringsContains(s.userInfo.Roles, "HardwareDeliveryManager") {
+	} else if service.StringsContains(s.userInfo.Roles, "ProductIntegrationManager") {
 		//	丁岳嵩 查看全部硬件 交付类型:10软件;20硬件
 		dao = dao.Where("a.order_type = ?", "20")
-	} else if service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentDirector") || service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentSupervisor") {
-		//	研发主管、研发总监看全部的
+		// 产品线负责人看自己负责的产品线
+	} else if service.StringsContains(s.userInfo.Roles, "ProductLineManager") {
+		productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.userInfo.Id), "product_code")
+		if err != nil {
+			return 0, nil, err
+		}
+		g.Log().Infof("DeliverOrderService List product_code %v", productCode)
+		dao = dao.Where("a.product in (?)", productCode)
+		// 大区经理看所管理的销售的(包括自己)
+	} else if service.StringsContains(s.userInfo.Roles, "RegionalManager") {
+		dao = dao.Where(fmt.Sprintf("b.sale_id IN (SELECT id FROM sys_user WHERE dept_id='%v')", s.userInfo.DeptId))
+		// 销售工程师看自己负责的项目的
+	} else if service.StringsContains(s.userInfo.Roles, "SalesEngineer") {
+		//dao = dao.Where("b.incharge_id = ?", s.userInfo.Id) // 改为关联项目
+		dao = dao.Where("b.sale_id = ?", s.userInfo.Id)
 	} else {
+		// 默认看自己的产品线
 		productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.userInfo.Id), "product_code")
 		if err != nil {
 			return 0, nil, err

+ 20 - 8
opms_parent/app/service/work/work_order.go

@@ -61,19 +61,31 @@ func NewOrderService(ctx context.Context) (svc *OrderService, err error) {
 // 列表
 func (s *OrderService) GetList(req *model.WorkOrderSearchReq) (total int, orderList []*model.WorkOrder, err error) {
 	db := s.Dao.FieldsEx(s.Dao.C.DeletedTime).As("a").LeftJoin("proj_business b", "a.nbo_id=b.id").Unscoped().Where("a.deleted_time is null")
-	// 销售只能看自己所属的,其他人只能看自己所属产品线的 (大区经理有可能同时具有销售角色,这里需要排除大区经理)
-	if service.StringsContains(s.CxtUser.Roles, "SalesEngineer") &&
-		!service.StringsContains(s.CxtUser.Roles, "RegionalManager") {
-		db = db.Where("b.sale_id = ?", s.CxtUser.Id)
-		// } else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
-		// 	dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
-	} else {
+	//支持工单权限划分:
+	//1.角色为销售工程师,可以看到申请人为销售自己的支持工单
+	//2.角色为大区经理,可以看到申请人为自己及下属的支持工单
+	//3.支持人员可以看到负责人为自己的支持工单
+	//4.产品线经理可以看到自己所属产品线的支持工单
+	//5.角色为系统管理员、总经理、销售总监、销售助理的可以看到所有的支持工单
+	if service.StringsContains(s.CxtUser.Roles, "GeneralManager") || service.StringsContains(s.CxtUser.Roles, "SalesDirector") || service.StringsContains(s.CxtUser.Roles, "SaleAssociate") || service.StringsContains(s.CxtUser.Roles, "SysAdmin") {
+		//	无条件,查询全部
+		// 产品线负责人看自己负责的产品线
+	} else if service.StringsContains(s.CxtUser.Roles, "ProductLineManager") {
 		productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.CxtUser.Id), "product_code")
 		if err != nil {
 			return 0, nil, err
 		}
 		g.Log().Infof("DeliverOrderService List product_code %v", productCode)
 		db = db.Where("a.product_line in (?)", productCode)
+		// 角色为大区经理,可以看到申请人为自己及下属的支持工单
+	} else if service.StringsContains(s.CxtUser.Roles, "RegionalManager") {
+		db = db.Where(fmt.Sprintf("a.created_by IN (SELECT id FROM sys_user WHERE dept_id='%v')", s.CxtUser.DeptId))
+		// 角色为销售工程师,可以看到申请人为销售自己的支持工单
+	} else if service.StringsContains(s.CxtUser.Roles, "SalesEngineer") {
+		db = db.Where("a.created_by = ?", s.CxtUser.Id)
+	} else {
+		// 支持人员可以看到负责人为自己的支持工单
+		db = db.Where("a.assign_user_id = ?", s.CxtUser.Id)
 	}
 	if req.Name != "" {
 		db = db.WhereLike("a."+s.Dao.C.Name, "%"+req.Name+"%")
@@ -286,7 +298,7 @@ func (s *OrderService) CreateWorkOrder(ctx context.Context, req *model.WorkOrder
 			}
 			uidlist, _ := json.Marshal([]string{uid})
 			req.FormData[i].Value = string(uidlist)
-			g.Log().Info(uid,string(uidlist), req.AssignUserId, req.AssignUserName)
+			g.Log().Info(uid, string(uidlist), req.AssignUserId, req.AssignUserName)
 		}
 	}