project_inventory.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. package opsdev
  2. import (
  3. "context"
  4. "fmt"
  5. "dashoo.cn/opms_libary/micro_srv"
  6. "dashoo.cn/opms_libary/request"
  7. contractdao "dashoo.cn/opms_parent/app/dao/contract"
  8. opsdevdao "dashoo.cn/opms_parent/app/dao/opsdev"
  9. "dashoo.cn/opms_parent/app/model/opsdev"
  10. "dashoo.cn/opms_parent/app/service"
  11. "github.com/gogf/gf/frame/g"
  12. )
  13. // ProjectInventoryService 项目清单服务
  14. type ProjectInventoryService struct {
  15. Dao *opsdevdao.OpsDeliveryProjectDao
  16. ContractDao *contractdao.CtrContractDao
  17. Tenant string
  18. userInfo request.UserInfo
  19. }
  20. // NewProjectInventoryService 初始化服务
  21. func NewProjectInventoryService(ctx context.Context) (*ProjectInventoryService, error) {
  22. tenant, err := micro_srv.GetTenant(ctx)
  23. if err != nil {
  24. return nil, fmt.Errorf("获取租户信息异常:%s", err.Error())
  25. }
  26. userInfo, err := micro_srv.GetUserInfo(ctx)
  27. if err != nil {
  28. return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
  29. }
  30. return &ProjectInventoryService{
  31. Dao: opsdevdao.NewOpsDeliveryProjectDao(tenant),
  32. ContractDao: contractdao.NewCtrContractDao(tenant),
  33. Tenant: tenant,
  34. userInfo: userInfo,
  35. }, nil
  36. }
  37. // GetList 获取项目清单列表
  38. func (s *ProjectInventoryService) GetList(req *opsdev.ProjectInventorySearchReq) (int, []*opsdev.ProjectInventoryRsp, error) {
  39. db := s.Dao.DB.Table("ops_delivery_project")
  40. db = db.LeftJoin("ctr_contract", "ctr_contract.id = ops_delivery_project.contract_id")
  41. db = db.LeftJoin("cust_customer", "cust_customer.id = ops_delivery_project.cust_id")
  42. db = db.Where("ops_delivery_project.deleted_time IS NULL")
  43. if req.ContractNo != "" {
  44. db = db.WhereLike("ctr_contract.contract_code", "%"+req.ContractNo+"%")
  45. }
  46. if req.ProjectName != "" {
  47. db = db.WhereLike("ops_delivery_project.project_name", "%"+req.ProjectName+"%")
  48. }
  49. if req.ProductLine != "" {
  50. db = db.Where("ops_delivery_project.product_line", req.ProductLine)
  51. }
  52. if req.ProjectStatus != "" {
  53. db = db.Where("ops_delivery_project.project_status", req.ProjectStatus)
  54. }
  55. if len(req.ProjectStatusList) > 0 {
  56. db = db.WhereIn("ops_delivery_project.project_status", req.ProjectStatusList)
  57. }
  58. if req.DeliveryNode != "" {
  59. db = db.Where("ops_delivery_project.delivery_node", req.DeliveryNode)
  60. }
  61. if req.DeliveryUserId > 0 {
  62. db = db.Where("ops_delivery_project.delivery_user_id", req.DeliveryUserId)
  63. }
  64. if req.SalesUserId > 0 {
  65. db = db.Where("ops_delivery_project.sales_user_id", req.SalesUserId)
  66. }
  67. if req.OpsManagerUserId > 0 {
  68. db = db.Where("ops_delivery_project.attribute4", req.OpsManagerUserId)
  69. }
  70. if req.PlanDeliveryTimeStart != "" {
  71. db = db.WhereGTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeStart)
  72. }
  73. if req.PlanDeliveryTimeEnd != "" {
  74. db = db.WhereLTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeEnd)
  75. }
  76. if req.PlanAcceptTimeStart != "" {
  77. db = db.WhereGTE("ops_delivery_project.plan_accept_time", req.PlanAcceptTimeStart)
  78. }
  79. if req.PlanAcceptTimeEnd != "" {
  80. db = db.WhereLTE("ops_delivery_project.plan_accept_time", req.PlanAcceptTimeEnd)
  81. }
  82. if s.userInfo.UserName != "admin" {
  83. hasPermission := false
  84. for _, role := range s.userInfo.Roles {
  85. if role == "SysAdmin" || role == "ResearchAndDevelopmentDirector" ||
  86. role == "ResearchAndDevelopmentSupervisor" || role == "QualityAssuranceSupervisor" ||
  87. role == "GeneralManager" || role == "SalesDirector" || role == "SaleAssociate" {
  88. hasPermission = true
  89. break
  90. }
  91. }
  92. if !hasPermission {
  93. userIds := []int{s.userInfo.Id}
  94. for _, role := range s.userInfo.Roles {
  95. if role == "ProjectManager" || role == "ProjectDeliveryManager" {
  96. db = db.Where("ops_delivery_project.delivery_user_id IN (?)", userIds)
  97. hasPermission = true
  98. break
  99. }
  100. if role == "SalesEngineer" {
  101. db = db.Where("ops_delivery_project.sales_user_id IN (?)", userIds)
  102. hasPermission = true
  103. break
  104. }
  105. }
  106. if !hasPermission {
  107. db = db.Where("1 = 0")
  108. }
  109. }
  110. }
  111. total, err := db.Count()
  112. if err != nil {
  113. return 0, nil, err
  114. }
  115. pageNum, pageSize := req.PageNum, req.PageSize
  116. if pageNum <= 0 {
  117. pageNum = 1
  118. }
  119. if pageSize <= 0 {
  120. pageSize = 20
  121. }
  122. db = db.Order("ops_delivery_project.created_time DESC")
  123. var records []*opsdev.ProjectInventoryRsp
  124. err = db.Page(pageNum, pageSize).Fields(
  125. "ops_delivery_project.id",
  126. "ops_delivery_project.project_name",
  127. "ops_delivery_project.product_line",
  128. "ops_delivery_project.project_status",
  129. "ops_delivery_project.delivery_node",
  130. "ops_delivery_project.delivery_user_id",
  131. "ops_delivery_project.delivery_user_name",
  132. "ops_delivery_project.sales_user_id",
  133. "ops_delivery_project.sales_user_name",
  134. "ops_delivery_project.plan_delivery_time",
  135. "ops_delivery_project.plan_accept_time",
  136. "ops_delivery_project.contract_id",
  137. "ops_delivery_project.contract_no",
  138. "ctr_contract.contract_amount",
  139. "ctr_contract.collected_amount",
  140. "ops_delivery_project.cust_id",
  141. "ops_delivery_project.cust_name",
  142. ).Scan(&records)
  143. if err != nil {
  144. return 0, nil, err
  145. }
  146. return total, records, nil
  147. }
  148. // GetProjectManagers 获取项目管理人员列表
  149. func (s *ProjectInventoryService) GetProjectManagers(roleType string) ([]*opsdev.ProjectManagerRsp, error) {
  150. var roleKeys []string
  151. switch roleType {
  152. case "projectManager":
  153. roleKeys = []string{"ProjectManager"}
  154. case "deliveryManager":
  155. roleKeys = []string{"ProjectDeliveryManager"}
  156. case "sales":
  157. roleKeys = []string{"SalesEngineer"}
  158. case "ops":
  159. roleKeys = []string{"OperationsEngineer"}
  160. case "all":
  161. roleKeys = []string{"ProjectManager", "ProjectDeliveryManager", "OperationsEngineer"}
  162. default:
  163. roleKeys = []string{"ProjectManager", "ProjectDeliveryManager", "OperationsEngineer"}
  164. }
  165. db := s.Dao.DB.Table("sys_user")
  166. db = db.LeftJoin("sys_user_role", "sys_user_role.user_id = sys_user.id")
  167. db = db.LeftJoin("sys_role", "sys_role.id = sys_user_role.role_id")
  168. db = db.LeftJoin("sys_dept", "sys_dept.id = sys_user.dept_id")
  169. db = db.Where("sys_user.deleted_time IS NULL")
  170. db = db.Where("sys_user.status", "10")
  171. db = db.WhereIn("sys_role.role_key", roleKeys)
  172. db = db.Distinct()
  173. var records []*opsdev.ProjectManagerRsp
  174. err := db.Fields(
  175. "sys_user.id as user_id",
  176. "sys_user.user_name",
  177. "sys_user.nick_name",
  178. "sys_dept.dept_name",
  179. "sys_role.role_name",
  180. ).Scan(&records)
  181. if err != nil {
  182. return nil, err
  183. }
  184. return records, nil
  185. }
  186. // GetContractProducts 获取合同产品列表
  187. func (s *ProjectInventoryService) GetContractProducts(contractId int) ([]*opsdev.ContractProductRsp, error) {
  188. productDao := contractdao.NewCtrContractProductDao(s.Tenant)
  189. db := productDao.Where("contract_id", contractId)
  190. db = db.Where("deleted_time IS NULL")
  191. db = db.Order("id ASC")
  192. var records []*opsdev.ContractProductRsp
  193. err := db.Scan(&records)
  194. if err != nil {
  195. return nil, err
  196. }
  197. return records, nil
  198. }
  199. // GetProductLines 获取产品线列表
  200. func (s *ProjectInventoryService) GetProductLines() []g.Map {
  201. return []g.Map{
  202. {"dictValue": "10", "dictLabel": "Biobank"},
  203. {"dictValue": "20", "dictLabel": "LIMS"},
  204. {"dictValue": "30", "dictLabel": "CellBank"},
  205. {"dictValue": "40", "dictLabel": "MCS"},
  206. {"dictValue": "50", "dictLabel": "信息化设备"},
  207. {"dictValue": "60", "dictLabel": "MedCare"},
  208. {"dictValue": "70", "dictLabel": "咨询服务"},
  209. }
  210. }
  211. // GetProjectStatusList 获取项目状态列表
  212. func (s *ProjectInventoryService) GetProjectStatusList() []g.Map {
  213. return []g.Map{
  214. {"dictValue": "10", "dictLabel": "待指派"},
  215. {"dictValue": "20", "dictLabel": "交付中"},
  216. {"dictValue": "30", "dictLabel": "暂停"},
  217. {"dictValue": "40", "dictLabel": "交付完成"},
  218. {"dictValue": "50", "dictLabel": "验收"},
  219. {"dictValue": "90", "dictLabel": "作废"},
  220. }
  221. }
  222. // GetDeliveryNodes 获取交付节点列表
  223. func (s *ProjectInventoryService) GetDeliveryNodes() []g.Map {
  224. return []g.Map{
  225. {"dictValue": "05", "dictLabel": "已指派"},
  226. {"dictValue": "10", "dictLabel": "内部启动会"},
  227. {"dictValue": "15", "dictLabel": "外部启动会"},
  228. {"dictValue": "20", "dictLabel": "制定计划"},
  229. {"dictValue": "30", "dictLabel": "项目实施"},
  230. {"dictValue": "40", "dictLabel": "完成部署"},
  231. {"dictValue": "50", "dictLabel": "试运行"},
  232. {"dictValue": "60", "dictLabel": "交付完成"},
  233. }
  234. }
  235. // Export 导出项目清单
  236. func (s *ProjectInventoryService) Export(ctx context.Context, req *opsdev.ProjectInventoryExportReq) (content *opsdev.ProjectInventoryExportContent, err error) {
  237. db := s.Dao.DB.Table("ops_delivery_project")
  238. db = db.LeftJoin("ctr_contract", "ctr_contract.id = ops_delivery_project.contract_id")
  239. db = db.LeftJoin("cust_customer", "cust_customer.id = ops_delivery_project.cust_id")
  240. db = db.Where("ops_delivery_project.deleted_time IS NULL")
  241. if req.ContractNo != "" {
  242. db = db.WhereLike("ctr_contract.contract_code", "%"+req.ContractNo+"%")
  243. }
  244. if req.ProjectName != "" {
  245. db = db.WhereLike("ops_delivery_project.project_name", "%"+req.ProjectName+"%")
  246. }
  247. if req.ProductLine != "" {
  248. db = db.Where("ops_delivery_project.product_line", req.ProductLine)
  249. }
  250. if req.ProjectStatus != "" {
  251. db = db.Where("ops_delivery_project.project_status", req.ProjectStatus)
  252. }
  253. if len(req.ProjectStatusList) > 0 {
  254. db = db.WhereIn("ops_delivery_project.project_status", req.ProjectStatusList)
  255. }
  256. if req.DeliveryNode != "" {
  257. db = db.Where("ops_delivery_project.delivery_node", req.DeliveryNode)
  258. }
  259. if req.DeliveryUserId > 0 {
  260. db = db.Where("ops_delivery_project.delivery_user_id", req.DeliveryUserId)
  261. }
  262. if req.SalesUserId > 0 {
  263. db = db.Where("ops_delivery_project.sales_user_id", req.SalesUserId)
  264. }
  265. if req.OpsManagerUserId > 0 {
  266. db = db.Where("ops_delivery_project.attribute4", req.OpsManagerUserId)
  267. }
  268. if req.PlanDeliveryTimeStart != "" {
  269. db = db.WhereGTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeStart)
  270. }
  271. if req.PlanDeliveryTimeEnd != "" {
  272. db = db.WhereLTE("ops_delivery_project.plan_delivery_time", req.PlanDeliveryTimeEnd)
  273. }
  274. if s.userInfo.UserName != "admin" {
  275. hasPermission := false
  276. for _, role := range s.userInfo.Roles {
  277. if role == "SysAdmin" || role == "ResearchAndDevelopmentDirector" ||
  278. role == "ResearchAndDevelopmentSupervisor" || role == "QualityAssuranceSupervisor" ||
  279. role == "GeneralManager" || role == "SalesDirector" || role == "SaleAssociate" {
  280. hasPermission = true
  281. break
  282. }
  283. }
  284. if !hasPermission {
  285. userIds := []int{s.userInfo.Id}
  286. for _, role := range s.userInfo.Roles {
  287. if role == "ProjectManager" || role == "ProjectDeliveryManager" {
  288. db = db.Where("ops_delivery_project.delivery_user_id IN (?)", userIds)
  289. hasPermission = true
  290. break
  291. }
  292. if role == "SalesEngineer" {
  293. db = db.Where("ops_delivery_project.sales_user_id IN (?)", userIds)
  294. hasPermission = true
  295. break
  296. }
  297. }
  298. if !hasPermission {
  299. db = db.Where("1 = 0")
  300. }
  301. }
  302. }
  303. db = db.Order("ops_delivery_project.created_time DESC")
  304. var records []*opsdev.ProjectInventoryRsp
  305. err = db.Fields(
  306. "ops_delivery_project.id",
  307. "ops_delivery_project.project_name",
  308. "ops_delivery_project.product_line",
  309. "ops_delivery_project.project_status",
  310. "ops_delivery_project.delivery_node",
  311. "ops_delivery_project.delivery_user_name",
  312. "ops_delivery_project.sales_user_name",
  313. "ops_delivery_project.plan_delivery_time",
  314. "ops_delivery_project.plan_accept_time",
  315. "ops_delivery_project.contract_no",
  316. "ctr_contract.contract_amount",
  317. "ctr_contract.collected_amount",
  318. "ops_delivery_project.cust_name",
  319. ).Scan(&records)
  320. if err != nil {
  321. return nil, err
  322. }
  323. productLines := s.GetProductLines()
  324. projectStatuses := s.GetProjectStatusList()
  325. deliveryNodes := s.GetDeliveryNodes()
  326. productLineMap := make(map[string]string)
  327. for _, pl := range productLines {
  328. productLineMap[pl["dictValue"].(string)] = pl["dictLabel"].(string)
  329. }
  330. projectStatusMap := make(map[string]string)
  331. for _, ps := range projectStatuses {
  332. projectStatusMap[ps["dictValue"].(string)] = ps["dictLabel"].(string)
  333. }
  334. deliveryNodeMap := make(map[string]string)
  335. for _, dn := range deliveryNodes {
  336. deliveryNodeMap[dn["dictValue"].(string)] = dn["dictLabel"].(string)
  337. }
  338. exportDataList := make([]map[string]interface{}, 0, len(records))
  339. for _, item := range records {
  340. planDeliveryTime := item.PlanDeliveryTime
  341. if len(planDeliveryTime) > 10 {
  342. planDeliveryTime = planDeliveryTime[:10]
  343. }
  344. planAcceptTime := item.PlanAcceptTime
  345. if len(planAcceptTime) > 10 {
  346. planAcceptTime = planAcceptTime[:10]
  347. }
  348. exportData := map[string]interface{}{
  349. "contractNo": item.ContractNo,
  350. "projectName": item.ProjectName,
  351. "productLine": productLineMap[item.ProductLine],
  352. "projectStatus": projectStatusMap[item.ProjectStatus],
  353. "deliveryNode": deliveryNodeMap[item.DeliveryNode],
  354. "deliveryUserName": item.DeliveryUserName,
  355. "salesUserName": item.SalesUserName,
  356. "planDeliveryTime": planDeliveryTime,
  357. "planAcceptTime": planAcceptTime,
  358. "contractAmount": fmt.Sprintf("%.2f", item.ContractAmount),
  359. "collectedAmount": fmt.Sprintf("%.2f", item.CollectedAmount),
  360. "custName": item.CustName,
  361. }
  362. exportDataList = append(exportDataList, exportData)
  363. }
  364. contentBase64, err := service.CommonExportExcel(ctx, "项目清单", opsdev.ProjectInventoryExportData{}, exportDataList)
  365. if err != nil {
  366. return nil, err
  367. }
  368. exportContent := new(opsdev.ProjectInventoryExportContent)
  369. exportContent.Content = contentBase64
  370. return exportContent, nil
  371. }