| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- package opsdev
- import (
- "context"
- "fmt"
- "dashoo.cn/opms_libary/micro_srv"
- "dashoo.cn/opms_libary/request"
- contractdao "dashoo.cn/opms_parent/app/dao/contract"
- opsdevdao "dashoo.cn/opms_parent/app/dao/opsdev"
- "dashoo.cn/opms_parent/app/model/opsdev"
- "dashoo.cn/opms_parent/app/service"
- "github.com/gogf/gf/frame/g"
- )
- // ProjectInventoryService 项目清单服务
- type ProjectInventoryService struct {
- Dao *opsdevdao.OpsDeliveryProjectDao
- ContractDao *contractdao.CtrContractDao
- Tenant string
- userInfo request.UserInfo
- }
- // NewProjectInventoryService 初始化服务
- func NewProjectInventoryService(ctx context.Context) (*ProjectInventoryService, error) {
- tenant, err := micro_srv.GetTenant(ctx)
- if err != nil {
- return nil, fmt.Errorf("获取租户信息异常:%s", err.Error())
- }
- userInfo, err := micro_srv.GetUserInfo(ctx)
- if err != nil {
- return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
- }
- return &ProjectInventoryService{
- Dao: opsdevdao.NewOpsDeliveryProjectDao(tenant),
- ContractDao: contractdao.NewCtrContractDao(tenant),
- Tenant: tenant,
- userInfo: userInfo,
- }, nil
- }
- // GetList 获取项目清单列表
- func (s *ProjectInventoryService) GetList(req *opsdev.ProjectInventorySearchReq) (int, []*opsdev.ProjectInventoryRsp, error) {
- db := s.Dao.DB.Table("ops_delivery_project")
- db = db.LeftJoin("ctr_contract", "ctr_contract.id = ops_delivery_project.contract_id")
- db = db.LeftJoin("cust_customer", "cust_customer.id = ops_delivery_project.cust_id")
- db = db.Where("ops_delivery_project.deleted_time IS NULL")
- if req.ContractNo != "" {
- db = db.WhereLike("ctr_contract.contract_code", "%"+req.ContractNo+"%")
- }
- if req.ProjectName != "" {
- db = db.WhereLike("ops_delivery_project.project_name", "%"+req.ProjectName+"%")
- }
- if req.ProductLine != "" {
- db = db.Where("ops_delivery_project.product_line", req.ProductLine)
- }
- if req.ProjectStatus != "" {
- db = db.Where("ops_delivery_project.project_status", req.ProjectStatus)
- }
- if req.DeliveryNode != "" {
- db = db.Where("ops_delivery_project.delivery_node", req.DeliveryNode)
- }
- if req.DeliveryUserId > 0 {
- db = db.Where("ops_delivery_project.delivery_user_id", req.DeliveryUserId)
- }
- if req.SalesUserId > 0 {
- db = db.Where("ops_delivery_project.sales_user_id", req.SalesUserId)
- }
- if req.PlanDeliveryTimeStart != "" {
- db = db.WhereGTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeStart)
- }
- if req.PlanDeliveryTimeEnd != "" {
- db = db.WhereLTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeEnd)
- }
- if req.PlanAcceptTimeStart != "" {
- db = db.WhereGTE("ops_delivery_project.plan_accept_time", req.PlanAcceptTimeStart)
- }
- if req.PlanAcceptTimeEnd != "" {
- db = db.WhereLTE("ops_delivery_project.plan_accept_time", req.PlanAcceptTimeEnd)
- }
- if s.userInfo.UserName != "admin" {
- hasPermission := false
- for _, role := range s.userInfo.Roles {
- if role == "SysAdmin" || role == "ResearchAndDevelopmentDirector" ||
- role == "ResearchAndDevelopmentSupervisor" || role == "QualityAssuranceSupervisor" ||
- role == "GeneralManager" || role == "SalesDirector" || role == "SaleAssociate" {
- hasPermission = true
- break
- }
- }
- if !hasPermission {
- userIds := []int{s.userInfo.Id}
- for _, role := range s.userInfo.Roles {
- if role == "ProjectManager" || role == "ProjectDeliveryManager" {
- db = db.Where("ops_delivery_project.delivery_user_id IN (?)", userIds)
- hasPermission = true
- break
- }
- if role == "SalesEngineer" {
- db = db.Where("ops_delivery_project.sales_user_id IN (?)", userIds)
- hasPermission = true
- break
- }
- }
- if !hasPermission {
- db = db.Where("1 = 0")
- }
- }
- }
- total, err := db.Count()
- if err != nil {
- return 0, nil, err
- }
- pageNum, pageSize := req.PageNum, req.PageSize
- if pageNum <= 0 {
- pageNum = 1
- }
- if pageSize <= 0 {
- pageSize = 20
- }
- db = db.Order("ops_delivery_project.created_time DESC")
- var records []*opsdev.ProjectInventoryRsp
- err = db.Page(pageNum, pageSize).Fields(
- "ops_delivery_project.id",
- "ops_delivery_project.project_name",
- "ops_delivery_project.product_line",
- "ops_delivery_project.project_status",
- "ops_delivery_project.delivery_node",
- "ops_delivery_project.delivery_user_id",
- "ops_delivery_project.delivery_user_name",
- "ops_delivery_project.sales_user_id",
- "ops_delivery_project.sales_user_name",
- "ops_delivery_project.plan_delivery_time",
- "ops_delivery_project.plan_accept_time",
- "ops_delivery_project.contract_id",
- "ops_delivery_project.contract_no",
- "ctr_contract.contract_amount",
- "ctr_contract.collected_amount",
- "ops_delivery_project.cust_id",
- "ops_delivery_project.cust_name",
- ).Scan(&records)
- if err != nil {
- return 0, nil, err
- }
- return total, records, nil
- }
- // GetProjectManagers 获取项目管理人员列表
- func (s *ProjectInventoryService) GetProjectManagers(roleType string) ([]*opsdev.ProjectManagerRsp, error) {
- var roleKeys []string
- switch roleType {
- case "projectManager":
- roleKeys = []string{"ProjectManager"}
- case "deliveryManager":
- roleKeys = []string{"ProjectDeliveryManager"}
- case "sales":
- roleKeys = []string{"SalesEngineer"}
- case "all":
- roleKeys = []string{"ProjectManager", "ProjectDeliveryManager"}
- default:
- roleKeys = []string{"ProjectManager", "ProjectDeliveryManager"}
- }
- db := s.Dao.DB.Table("sys_user")
- db = db.LeftJoin("sys_user_role", "sys_user_role.user_id = sys_user.id")
- db = db.LeftJoin("sys_role", "sys_role.id = sys_user_role.role_id")
- db = db.LeftJoin("sys_dept", "sys_dept.id = sys_user.dept_id")
- db = db.Where("sys_user.deleted_time IS NULL")
- db = db.Where("sys_user.status", "10")
- db = db.WhereIn("sys_role.role_key", roleKeys)
- db = db.Distinct()
- var records []*opsdev.ProjectManagerRsp
- err := db.Fields(
- "sys_user.id as user_id",
- "sys_user.user_name",
- "sys_user.nick_name",
- "sys_dept.dept_name",
- ).Scan(&records)
- if err != nil {
- return nil, err
- }
- return records, nil
- }
- // GetContractProducts 获取合同产品列表
- func (s *ProjectInventoryService) GetContractProducts(contractId int) ([]*opsdev.ContractProductRsp, error) {
- productDao := contractdao.NewCtrContractProductDao(s.Tenant)
- db := productDao.Where("contract_id", contractId)
- db = db.Where("deleted_time IS NULL")
- db = db.Order("id ASC")
- var records []*opsdev.ContractProductRsp
- err := db.Scan(&records)
- if err != nil {
- return nil, err
- }
- return records, nil
- }
- // GetProductLines 获取产品线列表
- func (s *ProjectInventoryService) GetProductLines() []g.Map {
- return []g.Map{
- {"dictValue": "10", "dictLabel": "Biobank"},
- {"dictValue": "20", "dictLabel": "LIMS"},
- {"dictValue": "30", "dictLabel": "CellBank"},
- {"dictValue": "40", "dictLabel": "MCS"},
- {"dictValue": "50", "dictLabel": "信息化设备"},
- {"dictValue": "60", "dictLabel": "MedCare"},
- {"dictValue": "70", "dictLabel": "咨询服务"},
- }
- }
- // GetProjectStatusList 获取项目状态列表
- func (s *ProjectInventoryService) GetProjectStatusList() []g.Map {
- return []g.Map{
- {"dictValue": "10", "dictLabel": "待指派"},
- {"dictValue": "20", "dictLabel": "交付中"},
- {"dictValue": "30", "dictLabel": "暂停"},
- {"dictValue": "40", "dictLabel": "交付完成"},
- {"dictValue": "50", "dictLabel": "验收"},
- {"dictValue": "90", "dictLabel": "作废"},
- }
- }
- // GetDeliveryNodes 获取交付节点列表
- func (s *ProjectInventoryService) GetDeliveryNodes() []g.Map {
- return []g.Map{
- {"dictValue": "05", "dictLabel": "已指派"},
- {"dictValue": "10", "dictLabel": "内部启动会"},
- {"dictValue": "15", "dictLabel": "外部启动会"},
- {"dictValue": "20", "dictLabel": "制定计划"},
- {"dictValue": "30", "dictLabel": "项目实施"},
- {"dictValue": "40", "dictLabel": "完成部署"},
- {"dictValue": "50", "dictLabel": "试运行"},
- {"dictValue": "60", "dictLabel": "交付完成"},
- }
- }
- // Export 导出项目清单
- func (s *ProjectInventoryService) Export(ctx context.Context, req *opsdev.ProjectInventoryExportReq) (content *opsdev.ProjectInventoryExportContent, err error) {
- db := s.Dao.DB.Table("ops_delivery_project")
- db = db.LeftJoin("ctr_contract", "ctr_contract.id = ops_delivery_project.contract_id")
- db = db.LeftJoin("cust_customer", "cust_customer.id = ops_delivery_project.cust_id")
- db = db.Where("ops_delivery_project.deleted_time IS NULL")
- if req.ContractNo != "" {
- db = db.WhereLike("ctr_contract.contract_code", "%"+req.ContractNo+"%")
- }
- if req.ProjectName != "" {
- db = db.WhereLike("ops_delivery_project.project_name", "%"+req.ProjectName+"%")
- }
- if req.ProductLine != "" {
- db = db.Where("ops_delivery_project.product_line", req.ProductLine)
- }
- if req.ProjectStatus != "" {
- db = db.Where("ops_delivery_project.project_status", req.ProjectStatus)
- }
- if req.DeliveryNode != "" {
- db = db.Where("ops_delivery_project.delivery_node", req.DeliveryNode)
- }
- if req.DeliveryUserId > 0 {
- db = db.Where("ops_delivery_project.delivery_user_id", req.DeliveryUserId)
- }
- if req.SalesUserId > 0 {
- db = db.Where("ops_delivery_project.sales_user_id", req.SalesUserId)
- }
- if req.PlanDeliveryTimeStart != "" {
- db = db.WhereGTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeStart)
- }
- if req.PlanDeliveryTimeEnd != "" {
- db = db.WhereLTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeEnd)
- }
- if s.userInfo.UserName != "admin" {
- hasPermission := false
- for _, role := range s.userInfo.Roles {
- if role == "SysAdmin" || role == "ResearchAndDevelopmentDirector" ||
- role == "ResearchAndDevelopmentSupervisor" || role == "QualityAssuranceSupervisor" ||
- role == "GeneralManager" || role == "SalesDirector" || role == "SaleAssociate" {
- hasPermission = true
- break
- }
- }
- if !hasPermission {
- userIds := []int{s.userInfo.Id}
- for _, role := range s.userInfo.Roles {
- if role == "ProjectManager" || role == "ProjectDeliveryManager" {
- db = db.Where("ops_delivery_project.delivery_user_id IN (?)", userIds)
- hasPermission = true
- break
- }
- if role == "SalesEngineer" {
- db = db.Where("ops_delivery_project.sales_user_id IN (?)", userIds)
- hasPermission = true
- break
- }
- }
- if !hasPermission {
- db = db.Where("1 = 0")
- }
- }
- }
- db = db.Order("ops_delivery_project.created_time DESC")
- var records []*opsdev.ProjectInventoryRsp
- err = db.Fields(
- "ops_delivery_project.id",
- "ops_delivery_project.project_name",
- "ops_delivery_project.product_line",
- "ops_delivery_project.project_status",
- "ops_delivery_project.delivery_node",
- "ops_delivery_project.delivery_user_name",
- "ops_delivery_project.sales_user_name",
- "ops_delivery_project.plan_delivery_time",
- "ops_delivery_project.plan_accept_time",
- "ops_delivery_project.contract_no",
- "ctr_contract.contract_amount",
- "ctr_contract.collected_amount",
- "ops_delivery_project.cust_name",
- ).Scan(&records)
- if err != nil {
- return nil, err
- }
- productLines := s.GetProductLines()
- projectStatuses := s.GetProjectStatusList()
- deliveryNodes := s.GetDeliveryNodes()
- productLineMap := make(map[string]string)
- for _, pl := range productLines {
- productLineMap[pl["dictValue"].(string)] = pl["dictLabel"].(string)
- }
- projectStatusMap := make(map[string]string)
- for _, ps := range projectStatuses {
- projectStatusMap[ps["dictValue"].(string)] = ps["dictLabel"].(string)
- }
- deliveryNodeMap := make(map[string]string)
- for _, dn := range deliveryNodes {
- deliveryNodeMap[dn["dictValue"].(string)] = dn["dictLabel"].(string)
- }
- exportDataList := make([]map[string]interface{}, 0, len(records))
- for _, item := range records {
- planDeliveryTime := item.PlanDeliveryTime
- if len(planDeliveryTime) > 10 {
- planDeliveryTime = planDeliveryTime[:10]
- }
- planAcceptTime := item.PlanAcceptTime
- if len(planAcceptTime) > 10 {
- planAcceptTime = planAcceptTime[:10]
- }
- exportData := map[string]interface{}{
- "contractNo": item.ContractNo,
- "projectName": item.ProjectName,
- "productLine": productLineMap[item.ProductLine],
- "projectStatus": projectStatusMap[item.ProjectStatus],
- "deliveryNode": deliveryNodeMap[item.DeliveryNode],
- "deliveryUserName": item.DeliveryUserName,
- "salesUserName": item.SalesUserName,
- "planDeliveryTime": planDeliveryTime,
- "planAcceptTime": planAcceptTime,
- "contractAmount": fmt.Sprintf("%.2f", item.ContractAmount),
- "collectedAmount": fmt.Sprintf("%.2f", item.CollectedAmount),
- "custName": item.CustName,
- }
- exportDataList = append(exportDataList, exportData)
- }
- contentBase64, err := service.CommonExportExcel(ctx, "项目清单", opsdev.ProjectInventoryExportData{}, exportDataList)
- if err != nil {
- return nil, err
- }
- exportContent := new(opsdev.ProjectInventoryExportContent)
- exportContent.Content = contentBase64
- return exportContent, nil
- }
|