project_inventory.go 13 KB

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