作者 liujunxiong

合并分支 'test' 到 'dev_liujunxiong'

Test



查看合并请求 !11
正在显示 90 个修改的文件 包含 6520 行增加137 行删除
@@ -28,4 +28,6 @@ _testmain.go @@ -28,4 +28,6 @@ _testmain.go
28 swagger.json 28 swagger.json
29 swagger.yaml 29 swagger.yaml
30 *.log 30 *.log
31 -lastupdate.tmp  
  31 +lastupdate.tmp
  32 +allied-creation-manufacture
  33 +main_local.go
  1 +{
  2 + // 使用 IntelliSense 了解相关属性。
  3 + // 悬停以查看现有属性的描述。
  4 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  5 + "version": "0.2.0",
  6 + "configurations": [
  7 + {
  8 + "name": "Launch file",
  9 + "type": "go",
  10 + "request": "launch",
  11 + "mode": "debug",
  12 + "program": "./main.go",
  13 + "buildFlags": "--tags=local"
  14 + }
  15 +
  16 + ]
  17 +}
1 # 生产制造项目说明 1 # 生产制造项目说明
2 2
  3 +- 开发环境服务器地址:http://allied-creation-manufacture-dev.fjmaimaimai.com
  4 +- 测试环境服务器地址: http://allied-creation-manufacture-test.fjmaimaimai.com
  5 +
  6 +- 前端调用的地址 http://allied-creation-gateway-dev.fjmaimaimai.com/v1/manufacture
  7 +- 前端调用的地址 http://allied-creation-gateway-test.fjmaimaimai.com/v1/manufacture
  8 +
3 ## 1.数据导入导出模块 9 ## 1.数据导入导出模块
4 10
5 -### 1.1.Excel导入流程 11 +### 1.1.Excel 导入流程
6 12
7 - 原型说明 13 - 原型说明
8 14
@@ -14,7 +20,6 @@ @@ -14,7 +20,6 @@
14 20
15 - [导入接口文档地址](https://doc-press.fjmaimaimai.com/team/frontend/plugins/business/import.html) 21 - [导入接口文档地址](https://doc-press.fjmaimaimai.com/team/frontend/plugins/business/import.html)
16 22
17 -  
18 ``` 23 ```
19 POST/v1/web/file-import 24 POST/v1/web/file-import
20 25
@@ -26,11 +31,10 @@ file 文件 @@ -26,11 +31,10 @@ file 文件
26 code 对应导入模块的编码 31 code 对应导入模块的编码
27 ``` 32 ```
28 33
29 -- ``对接步骤``以导入公司用户模块为例 34 +- `对接步骤`以导入公司用户模块为例
  35 +
  36 + 1.定义接口导入的`code`为`ADMIN_SYSTEM-MANAGE_BASE_USER` 2.根据接口解析导入文件的数据 3.调用基础库解析数据并传到后台
30 37
31 -1.定义接口导入的``code``为``ADMIN_SYSTEM-MANAGE_BASE_USER``  
32 -2.根据接口解析导入文件的数据  
33 -3.调用基础库解析数据并传到后台  
34 ```go 38 ```go
35 39
36 // 1.解析列 40 // 1.解析列
@@ -80,21 +84,23 @@ result, err := userGateway.UserBatchAdd(allied_creation_user.ReqBatchAddUser{ @@ -80,21 +84,23 @@ result, err := userGateway.UserBatchAdd(allied_creation_user.ReqBatchAddUser{
80 ``` 84 ```
81 85
82 ```go 86 ```go
  87 +
83 ``` 88 ```
84 89
85 -### 2.2 Excel导出流程 90 +### 2.2 Excel 导出流程
86 91
87 - 功能原型说明 92 - 功能原型说明
88 93
89 -实现可以自定义选择列进行导出,以及选择导出格式,导出格式有 ``xlsx``\\``csv``,功能如下图所示: 94 +实现可以自定义选择列进行导出,以及选择导出格式,导出格式有 `xlsx`\\`csv`,功能如下图所示:
90 95
91 ![](https://timeless-world.oss-cn-shenzhen.aliyuncs.com/opportunity/dev_online/20220225/object/1645789890_JbTa22EtANsD3fm2nJ4aH6FJkHzXaHJB.png) 96 ![](https://timeless-world.oss-cn-shenzhen.aliyuncs.com/opportunity/dev_online/20220225/object/1645789890_JbTa22EtANsD3fm2nJ4aH6FJkHzXaHJB.png)
92 97
93 - 前后端交互说明 98 - 前后端交互说明
94 99
95 -``接口定义`` 100 +`接口定义`
96 101
97 导出接口 102 导出接口
  103 +
98 ```shell 104 ```shell
99 POST /v1/web/file-export 105 POST /v1/web/file-export
100 106
@@ -130,9 +136,7 @@ GET/v1/web/file-export/fields/:code @@ -130,9 +136,7 @@ GET/v1/web/file-export/fields/:code
130 136
131 - 交互流程 137 - 交互流程
132 138
133 -1.前台根据 ``导出列查询接口`` 获取可以导出的列;  
134 -2.勾选需要导出的列、文件格式,调用 ``导出接口`` 向后台发起导出数据请求;  
135 - 139 + 1.前台根据 `导出列查询接口` 获取可以导出的列; 2.勾选需要导出的列、文件格式,调用 `导出接口` 向后台发起导出数据请求;
136 140
137 #### 2.2.1 后端导出实现 141 #### 2.2.1 后端导出实现
138 142
@@ -148,6 +152,7 @@ type ExcelMaker interface { @@ -148,6 +152,7 @@ type ExcelMaker interface {
148 ``` 152 ```
149 153
150 如下所示 154 如下所示
  155 +
151 ```go 156 ```go
152 //ExportCooperationUserData 导出共创用户数据 157 //ExportCooperationUserData 导出共创用户数据
153 type ExportCooperationUserData struct { 158 type ExportCooperationUserData struct {
@@ -251,5 +256,5 @@ func (controller *ExcelDataController) responseExcelByFile(ctx *context.Context, @@ -251,5 +256,5 @@ func (controller *ExcelDataController) responseExcelByFile(ctx *context.Context,
251 //跳过保存文件,直接写入ctx.ResponseWriter 256 //跳过保存文件,直接写入ctx.ResponseWriter
252 excelExport.ExcelFile.Write(ctx.ResponseWriter) 257 excelExport.ExcelFile.Write(ctx.ResponseWriter)
253 return nil 258 return nil
254 -} 259 +}
255 ``` 260 ```
@@ -2,5 +2,17 @@ @@ -2,5 +2,17 @@
2 -- 表 product_plan 2 -- 表 product_plan
3 -- 唯一索引 company_id,org_id,batch_number 3 -- 唯一索引 company_id,org_id,batch_number
4 create unique index idx_product_plan_company_id_org_id_batch_number on manufacture.product_plan using btree (company_id,org_id,batch_number); 4 create unique index idx_product_plan_company_id_org_id_batch_number on manufacture.product_plan using btree (company_id,org_id,batch_number);
  5 +CREATE INDEX IF NOT EXISTS idx_files_source_file_id on metadata.files using btree(source_file_id);
5 6
  7 +CREATE INDEX IF NOT EXISTS idx_tables_company_id_table_type on metadata.tables using btree((context->>'companyId'),table_type);
  8 +CREATE INDEX IF NOT EXISTS idx_tables_parent_id on metadata.tables using btree(parent_id);
6 9
  10 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_log_type_source_id on metadata.logs using btree((context->>'companyId'),log_type,source_id);
  11 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_object_name on metadata.logs using btree((context->>'companyId'),object_name);
  12 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_object_type on metadata.logs using btree((context->>'companyId'),object_type);
  13 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_operation_type on metadata.logs using btree((context->>'companyId'),operation_type);
  14 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_content on metadata.logs using btree((context->>'companyId'),content);
  15 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_operator_name on metadata.logs using btree((context->>'companyId'),operator_name);
  16 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_created_at on metadata.logs using btree((context->>'companyId'),created_at);
  17 +
  18 +CREATE INDEX IF NOT EXISTS idx_mapping_rules_company_id_table_id_file_id on metadata.mapping_rules using btree((context->>'companyId'),table_id,file_id);
@@ -2,7 +2,7 @@ apiVersion: v1 @@ -2,7 +2,7 @@ apiVersion: v1
2 kind: Service 2 kind: Service
3 metadata: 3 metadata:
4 name: allied-creation-manufacture 4 name: allied-creation-manufacture
5 - namespace: mmm-suplus-test 5 + namespace: mmm-suplus-dev
6 labels: 6 labels:
7 k8s-app: allied-creation-manufacture 7 k8s-app: allied-creation-manufacture
8 spec: 8 spec:
@@ -17,7 +17,7 @@ apiVersion: extensions/v1beta1 @@ -17,7 +17,7 @@ apiVersion: extensions/v1beta1
17 kind: Deployment 17 kind: Deployment
18 metadata: 18 metadata:
19 name: allied-creation-manufacture 19 name: allied-creation-manufacture
20 - namespace: mmm-suplus-test 20 + namespace: mmm-suplus-dev
21 labels: 21 labels:
22 k8s-app: allied-creation-manufacture 22 k8s-app: allied-creation-manufacture
23 spec: 23 spec:
@@ -97,29 +97,29 @@ spec: @@ -97,29 +97,29 @@ spec:
97 - name: HTTP_PORT 97 - name: HTTP_PORT
98 value: "8082" 98 value: "8082"
99 - name: SERVICE_ENV 99 - name: SERVICE_ENV
100 - value: "test" 100 + value: "dev"
101 - name: SUPLUS_ADMIN_BASE_HOST 101 - name: SUPLUS_ADMIN_BASE_HOST
102 value: "http://suplus-admin-base-dev.fjmaimaimai.com" 102 value: "http://suplus-admin-base-dev.fjmaimaimai.com"
103 - name: ALLIED_CREATION_GATEWAY_HOST 103 - name: ALLIED_CREATION_GATEWAY_HOST
104 - value: "https://allied-creation-gateway-test.fjmaimaimai.com" 104 + value: "http://allied-creation-gateway-dev.fjmaimaimai.com"
105 - name: ALLIED_CREATION_USER_HOST 105 - name: ALLIED_CREATION_USER_HOST
106 - value: "https://allied-creation-user-test.fjmaimaimai.com" 106 + value: "http://allied-creation-user-dev.fjmaimaimai.com"
107 - name: ALLIED_CREATION_COOPERATION_HOST 107 - name: ALLIED_CREATION_COOPERATION_HOST
108 - value: "https://allied-creation-cooperation-test.fjmaimaimai.com" 108 + value: "http://allied-creation-cooperation-dev.fjmaimaimai.com"
109 - name: ALLIED_CREATION_BASIC_HOST 109 - name: ALLIED_CREATION_BASIC_HOST
110 - value: "https://allied-creation-basic-test.fjmaimaimai.com" 110 + value: "http://allied-creation-basic-dev.fjmaimaimai.com"
111 - name: ALLIED_CREATION_MANUFACTURE_HOST 111 - name: ALLIED_CREATION_MANUFACTURE_HOST
112 - value: "http://allied-creation-manufacture-test.fjmaimaimai.com" 112 + value: "http://allied-creation-manufacture-dev.fjmaimaimai.com"
113 - name: SMS_SERVE_HOST 113 - name: SMS_SERVE_HOST
114 value: "https://sms.fjmaimaimai.com:9897" 114 value: "https://sms.fjmaimaimai.com:9897"
115 - name: SUPLUS_SALE_APP 115 - name: SUPLUS_SALE_APP
116 - value: "http://suplus-sale-app-gateway-test.fjmaimaimai.com" 116 + value: "http://suplus-sale-app-gateway-dev.fjmaimaimai.com"
117 - name: MANUFACTURE_DEFAULT_COMPANYID 117 - name: MANUFACTURE_DEFAULT_COMPANYID
118 - value: "23" 118 + value: "1"
119 - name: MANUFACTURE_DEFAULT_ORGID 119 - name: MANUFACTURE_DEFAULT_ORGID
120 - value: "487" 120 + value: "1"
121 - name: MANUFACTURE_DEFAULT_WORKSHOPID 121 - name: MANUFACTURE_DEFAULT_WORKSHOPID
122 - value: "28" 122 + value: "2"
123 - name: MANUFACTURE_PRODUCT_TYPE 123 - name: MANUFACTURE_PRODUCT_TYPE
124 value: "SG,SG" 124 value: "SG,SG"
125 - name: MQTT_HOST 125 - name: MQTT_HOST
1 #!/bin/bash 1 #!/bin/bash
2 export PATH=/root/local/bin:$PATH 2 export PATH=/root/local/bin:$PATH
3 -kubectl -n <replace-your-k8s-namespace> get pods | grep -q project 3 +kubectl -n mmm-suplus-dev get pods | grep -q allied-creation-manufacture
4 if [ "$?" == "1" ];then 4 if [ "$?" == "1" ];then
5 - kubectl create -f /tmp/dev/project/project.yaml --record  
6 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q project 5 + kubectl create -f /tmp/dev/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  6 + kubectl -n mmm-suplus-dev get svc | grep -q allied-creation-manufacture
7 if [ "$?" == "0" ];then 7 if [ "$?" == "0" ];then
8 - echo "project service install success!" 8 + echo "allied-creation-manufacture service install success!"
9 else 9 else
10 - echo "project service install fail!" 10 + echo "allied-creation-manufacture service install fail!"
11 fi 11 fi
12 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q project 12 + kubectl -n mmm-suplus-dev get pods | grep -q allied-creation-manufacture
13 if [ "$?" == "0" ];then 13 if [ "$?" == "0" ];then
14 - echo "project deployment install success!" 14 + echo "allied-creation-manufacture deployment install success!"
15 else 15 else
16 - echo "project deployment install fail!" 16 + echo "allied-creation-manufacture deployment install fail!"
17 fi 17 fi
18 else 18 else
19 - kubectl delete -f /tmp/dev/project/project.yaml  
20 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q project 19 + kubectl delete -f /tmp/dev/allied-creation-manufacture/allied-creation-manufacture.yaml
  20 + kubectl -n mmm-suplus-dev get svc | grep -q allied-creation-manufacture
21 while [ "$?" == "0" ] 21 while [ "$?" == "0" ]
22 do 22 do
23 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q project 23 + kubectl -n mmm-suplus-dev get svc | grep -q allied-creation-manufacture
24 done 24 done
25 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q project 25 + kubectl -n mmm-suplus-dev get pods | grep -q allied-creation-manufacture
26 while [ "$?" == "0" ] 26 while [ "$?" == "0" ]
27 do 27 do
28 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q project 28 + kubectl -n mmm-suplus-dev get pods | grep -q allied-creation-manufacture
29 done 29 done
30 - kubectl create -f /tmp/dev/project/project.yaml --record  
31 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q project 30 + kubectl create -f /tmp/dev/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  31 + kubectl -n mmm-suplus-dev get svc | grep -q allied-creation-manufacture
32 if [ "$?" == "0" ];then 32 if [ "$?" == "0" ];then
33 - echo "project service update success!" 33 + echo "allied-creation-manufacture service update success!"
34 else 34 else
35 - echo "project service update fail!" 35 + echo "allied-creation-manufacture service update fail!"
36 fi 36 fi
37 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q project 37 + kubectl -n mmm-suplus-dev get pods | grep -q allied-creation-manufacture
38 if [ "$?" == "0" ];then 38 if [ "$?" == "0" ];then
39 - echo "project deployment update success!" 39 + echo "allied-creation-manufacture deployment update success!"
40 else 40 else
41 - echo "project deployment update fail!" 41 + echo "allied-creation-manufacture deployment update fail!"
42 fi 42 fi
43 fi 43 fi
@@ -119,4 +119,6 @@ spec: @@ -119,4 +119,6 @@ spec:
119 - name: MQTT_HOST 119 - name: MQTT_HOST
120 value: "47.97.5.102" 120 value: "47.97.5.102"
121 - name: MQTT_PORT 121 - name: MQTT_PORT
122 - value: "6000"  
  122 + value: "6000"
  123 + - name: MQTT_UP
  124 + value: "true"
  1 +//go:build !local
  2 +// +build !local
  3 +
1 package main 4 package main
2 5
3 import ( 6 import (
4 "fmt" 7 "fmt"
  8 + "time"
  9 +
5 "github.com/beego/beego/v2/server/web" 10 "github.com/beego/beego/v2/server/web"
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/crontab" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/crontab"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
@@ -9,7 +14,6 @@ import ( @@ -9,7 +14,6 @@ import (
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/mqtt" 15 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/mqtt"
11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/task" 16 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/task"
12 - "time"  
13 17
14 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 18 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
15 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" 19 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
@@ -2,10 +2,11 @@ package command @@ -2,10 +2,11 @@ package command
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 - "github.com/beego/beego/v2/core/validation"  
6 - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"  
7 "reflect" 5 "reflect"
8 "strings" 6 "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
9 ) 10 )
10 11
11 type CreateAttendanceCommand struct { 12 type CreateAttendanceCommand struct {
@@ -14,7 +15,7 @@ type CreateAttendanceCommand struct { @@ -14,7 +15,7 @@ type CreateAttendanceCommand struct {
14 // 考勤类型 1.正常 2.支援 15 // 考勤类型 1.正常 2.支援
15 AttendanceType int `cname:"考勤类型" json:"attendanceType,omitempty"` 16 AttendanceType int `cname:"考勤类型" json:"attendanceType,omitempty"`
16 // 生产班组Id 17 // 生产班组Id
17 - ProductGroupId int `cname:"生产班组Id" json:"productGroupId,omitempty" valid:"Required"` 18 + // ProductGroupId int `cname:"生产班组Id" json:"productGroupId,omitempty" valid:"Required"`
18 // 生产工人 19 // 生产工人
19 ProductWorkerId int `cname:"生产工人" json:"productWorkerId,omitempty" valid:"Required"` 20 ProductWorkerId int `cname:"生产工人" json:"productWorkerId,omitempty" valid:"Required"`
20 // 车间ID 21 // 车间ID
1 package dto 1 package dto
2 2
3 import ( 3 import (
  4 + "time"
  5 +
4 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
6 - "time"  
7 ) 8 )
8 9
9 type AttendanceRecordDto struct { 10 type AttendanceRecordDto struct {
@@ -63,7 +64,9 @@ func (d *AttendanceRecordDto) LoadDto(m *domain.ProductAttendanceRecord, orgId i @@ -63,7 +64,9 @@ func (d *AttendanceRecordDto) LoadDto(m *domain.ProductAttendanceRecord, orgId i
63 d.WorkTimeAfter = m.WorkTimeAfter 64 d.WorkTimeAfter = m.WorkTimeAfter
64 d.AttendanceStatus = m.AttendanceStatus 65 d.AttendanceStatus = m.AttendanceStatus
65 d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) 66 d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
66 - d.OrgName = m.Ext.OrgName 67 + if m.Ext != nil {
  68 + d.OrgName = m.Ext.OrgName
  69 + }
67 d.ApproveUser = m.ApproveUser() 70 d.ApproveUser = m.ApproveUser()
68 d.GroupName = m.GroupName() 71 d.GroupName = m.GroupName()
69 if m.Ext != nil && m.Ext.AttendanceExt != nil { 72 if m.Ext != nil && m.Ext.AttendanceExt != nil {
@@ -2,6 +2,8 @@ package service @@ -2,6 +2,8 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "time"
  6 +
5 "github.com/linmadan/egglib-go/core/application" 7 "github.com/linmadan/egglib-go/core/application"
6 "github.com/linmadan/egglib-go/transaction/pg" 8 "github.com/linmadan/egglib-go/transaction/pg"
7 "github.com/linmadan/egglib-go/utils/xtime" 9 "github.com/linmadan/egglib-go/utils/xtime"
@@ -13,12 +15,16 @@ import ( @@ -13,12 +15,16 @@ import (
13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" 15 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" 16 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
15 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 17 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
16 - "time"  
17 ) 18 )
18 19
19 type AttendanceService struct { 20 type AttendanceService struct {
20 } 21 }
21 22
  23 +func NewAttendanceService(options map[string]interface{}) *AttendanceService {
  24 + newAttendanceService := &AttendanceService{}
  25 + return newAttendanceService
  26 +}
  27 +
22 // 审核工时 28 // 审核工时
23 func (attendanceService *AttendanceService) ApproveAttendance(cmd *command.ApproveAttendanceCommand) (interface{}, error) { 29 func (attendanceService *AttendanceService) ApproveAttendance(cmd *command.ApproveAttendanceCommand) (interface{}, error) {
24 if err := cmd.ValidateCommand(); err != nil { 30 if err := cmd.ValidateCommand(); err != nil {
@@ -99,11 +105,11 @@ func (attendanceService *AttendanceService) CreateAttendance(operateInfo *domain @@ -99,11 +105,11 @@ func (attendanceService *AttendanceService) CreateAttendance(operateInfo *domain
99 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 105 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
100 } 106 }
101 107
102 - var productGroup *domain.ProductGroup  
103 - _, productGroup, err = factory.FastPgProductGroup(transactionContext, cmd.ProductGroupId)  
104 - if err != nil {  
105 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
106 - } 108 + // var productGroup *domain.ProductGroup
  109 + // _, productGroup, err = factory.FastPgProductGroup(transactionContext, cmd.ProductGroupId)
  110 + // if err != nil {
  111 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  112 + // }
107 113
108 //var workTime float64 = 0 114 //var workTime float64 = 0
109 //if cmd.WorkTime-cmd.BreakTime > 0 { 115 //if cmd.WorkTime-cmd.BreakTime > 0 {
@@ -139,9 +145,9 @@ func (attendanceService *AttendanceService) CreateAttendance(operateInfo *domain @@ -139,9 +145,9 @@ func (attendanceService *AttendanceService) CreateAttendance(operateInfo *domain
139 CreatedAt: time.Now(), 145 CreatedAt: time.Now(),
140 UpdatedAt: time.Now(), 146 UpdatedAt: time.Now(),
141 Ext: domain.NewExt(org.OrgName).WithAttendanceExt(&domain.ProductAttendanceRecordExt{ 147 Ext: domain.NewExt(org.OrgName).WithAttendanceExt(&domain.ProductAttendanceRecordExt{
142 - GroupName: productGroup.GroupName,  
143 - ProductGroupId: productGroup.ProductGroupId,  
144 - BreakTime: cmd.BreakTime, 148 + // GroupName: productGroup.GroupName,
  149 + // ProductGroupId: productGroup.ProductGroupId,
  150 + BreakTime: cmd.BreakTime,
145 }), 151 }),
146 ProductDate: productDate, 152 ProductDate: productDate,
147 } 153 }
@@ -426,8 +432,3 @@ func (attendanceService *AttendanceService) SearchWorkshopWorkTimeStatics(operat @@ -426,8 +432,3 @@ func (attendanceService *AttendanceService) SearchWorkshopWorkTimeStatics(operat
426 } 432 }
427 return count, result, nil 433 return count, result, nil
428 } 434 }
429 -  
430 -func NewAttendanceService(options map[string]interface{}) *AttendanceService {  
431 - newAttendanceService := &AttendanceService{}  
432 - return newAttendanceService  
433 -}  
@@ -30,7 +30,7 @@ func (attendanceService *AttendanceService) WorkshopWorkTimeRecordStatics(cmd *c @@ -30,7 +30,7 @@ func (attendanceService *AttendanceService) WorkshopWorkTimeRecordStatics(cmd *c
30 log.Logger.Error(err.Error()) 30 log.Logger.Error(err.Error())
31 return nil, err 31 return nil, err
32 } 32 }
33 - 33 + //TODO 添加功过统计
34 if err := transactionContext.CommitTransaction(); err != nil { 34 if err := transactionContext.CommitTransaction(); err != nil {
35 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 35 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
36 } 36 }
@@ -2,9 +2,10 @@ package service @@ -2,9 +2,10 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "strings"
  6 +
5 "github.com/linmadan/egglib-go/core/application" 7 "github.com/linmadan/egglib-go/core/application"
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
7 - "strings"  
8 9
9 "github.com/linmadan/egglib-go/utils/excel" 10 "github.com/linmadan/egglib-go/utils/excel"
10 ) 11 )
@@ -51,7 +52,7 @@ func (srv ExcelDataService) fieldValueAllEmpty(param map[string]string) bool { @@ -51,7 +52,7 @@ func (srv ExcelDataService) fieldValueAllEmpty(param map[string]string) bool {
51 return isAllEmpty 52 return isAllEmpty
52 } 53 }
53 54
54 -//// FileImportTemplate 导入模板 55 +// // FileImportTemplate 导入模板
55 func (srv ExcelDataService) FileImportTemplate(importDataCommand *command.ImportDataCommand) (interface{}, error) { 56 func (srv ExcelDataService) FileImportTemplate(importDataCommand *command.ImportDataCommand) (interface{}, error) {
56 var mapTemplate = map[string]string{ 57 var mapTemplate = map[string]string{
57 //domain.ImportCompanyUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210916/object/1631807485_EaxECeRz23WpzrMZmbwdEPRJ3Pdxpx5X.xlsx", 58 //domain.ImportCompanyUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210916/object/1631807485_EaxECeRz23WpzrMZmbwdEPRJ3Pdxpx5X.xlsx",
@@ -59,6 +60,12 @@ func (srv ExcelDataService) FileImportTemplate(importDataCommand *command.Import @@ -59,6 +60,12 @@ func (srv ExcelDataService) FileImportTemplate(importDataCommand *command.Import
59 //domain.ImportDividendsOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743206_NPYTKw6RGhXn4TpYNEQhGGdCkXKXTnxM.xlsx", 60 //domain.ImportDividendsOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743206_NPYTKw6RGhXn4TpYNEQhGGdCkXKXTnxM.xlsx",
60 //domain.ImportCooperationUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210926/object/1632635345_SbfzmkXjQHhCwPw4MB7zb5EBBtdp2MSE.xlsx", 61 //domain.ImportCooperationUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210926/object/1632635345_SbfzmkXjQHhCwPw4MB7zb5EBBtdp2MSE.xlsx",
61 //domain.ImportDividendsReturnOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743214_rNHm6ZBXZaC5xKTrsE7M4h45MY6n6Ff3.xlsx", 62 //domain.ImportDividendsReturnOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743214_rNHm6ZBXZaC5xKTrsE7M4h45MY6n6Ff3.xlsx",
  63 + //二级品审核导入
  64 + //"ImportProductRecordLevel2": "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20221030/object/1667144411_R3h4nQxxcMJ7ympktMsYBBQ6bAcFC6xj.xlsx",
  65 + //工时管理导入
  66 + //"ImportAttendance": "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20221030/object/1667144523_w66QpzZTfxsmhbM5mmBrHjpytcydMNs2.xlsx",
  67 + //事故管理导入
  68 + // "ImportProductTrouble": "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/test/20221030/object/1667144570_xYKYMrMnXWTyasDPnX2JNXEZHd3rJsWG.xlsx",
62 } 69 }
63 var url string 70 var url string
64 var ok bool 71 var ok bool
  1 +package service
  2 +
  3 +import (
  4 + "errors"
  5 + "fmt"
  6 + "strconv"
  7 + "strings"
  8 + "time"
  9 +
  10 + "github.com/linmadan/egglib-go/core/application"
  11 + "github.com/linmadan/egglib-go/utils/excel"
  12 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  15 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  16 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter"
  17 +)
  18 +
  19 +type importAttendance struct {
  20 + ProductDate string `json:"productDate"` //日期
  21 + WorkshopName string `json:"workshopName"` //车间名称
  22 + LineName string `json:"lineName"` //线别名称
  23 + SectionName string `json:"sectionName"` //工位名称
  24 + WorkerName string `json:"workerName"` //工人姓名
  25 + AttendanceType string `json:"attendanceType"` //考勤类型 正常 支援
  26 + SignIn string `json:"signIn"` //上岗时间
  27 + SignOut string `json:"signOut"` //离岗时间
  28 + BreakTime string `json:"breakTime"` //休息时间
  29 + FailReason string `json:"failReason"` //数据校验失败的理由
  30 +}
  31 +
  32 +func (data *importAttendance) validField() error {
  33 + if len(data.ProductDate) == 0 {
  34 + return errors.New("日期未填写。")
  35 + }
  36 + if len(data.WorkerName) == 0 {
  37 + return errors.New("车间名称未填写。")
  38 + }
  39 + if len(data.LineName) == 0 {
  40 + return errors.New("线别名称未填写。")
  41 + }
  42 + if len(data.SectionName) == 0 {
  43 + return errors.New("工位名称未填写。")
  44 + }
  45 + if len(data.WorkerName) == 0 {
  46 + return errors.New("工人姓名未填写。")
  47 + }
  48 + if len(data.AttendanceType) == 0 {
  49 + return errors.New("类型未填写。")
  50 + }
  51 + if len(data.SignIn) == 0 {
  52 + return errors.New("上岗时间未填写。")
  53 + }
  54 + if len(data.SignOut) == 0 {
  55 + return errors.New("下岗时间未填写。")
  56 + }
  57 + if len(data.BreakTime) == 0 {
  58 + return errors.New("休息时间未填写。")
  59 + }
  60 +
  61 + return nil
  62 +}
  63 +
  64 +// 导入生产计划
  65 +func (srv ExcelDataService) ImportDataAttendance(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  66 + excelImport := excel.NewExcelImport()
  67 + excelImport.RowBegin = 3 //第二行开始读取
  68 + excelImport.DataFields = []excel.DataField{
  69 + {EnName: "productDate", CnName: "日期"},
  70 + {EnName: "workshopName", CnName: "车间"},
  71 + {EnName: "lineName", CnName: "线别"},
  72 + {EnName: "sectionName", CnName: "工段"},
  73 + {EnName: "workerName", CnName: "姓名"},
  74 + {EnName: "attendanceType", CnName: "类型"},
  75 + {EnName: "signIn", CnName: "上岗时间"},
  76 + {EnName: "signOut", CnName: "离岗时间"},
  77 + {EnName: "breakTime", CnName: "休息时长(小时)"},
  78 + }
  79 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  80 + if err != nil {
  81 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  82 + }
  83 + items := make([]importAttendance, 0)
  84 + for _, v := range excelData {
  85 + item := importAttendance{
  86 + ProductDate: strings.TrimSpace(v["productDate"]),
  87 + WorkshopName: strings.TrimSpace(v["workshopName"]),
  88 + LineName: strings.TrimSpace(v["lineName"]),
  89 + SectionName: strings.TrimSpace(v["sectionName"]),
  90 + WorkerName: strings.TrimSpace(v["workerName"]),
  91 + AttendanceType: strings.TrimSpace(v["attendanceType"]),
  92 + SignIn: strings.TrimSpace(v["signIn"]),
  93 + SignOut: strings.TrimSpace(v["signOut"]),
  94 + BreakTime: strings.TrimSpace(v["breakTime"]),
  95 + FailReason: "",
  96 + }
  97 + items = append(items, item)
  98 + }
  99 + failRows, err := srv.BatchAddAttendance(*importDataCommand.Operator, items)
  100 + if err != nil {
  101 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  102 + }
  103 + return srv.importResultWithHeader(excelImport.DataFields, failRows, len(items)), nil
  104 +}
  105 +
  106 +// BatchAddAttendance 工时管理,导入工时数据
  107 +func (srv ExcelDataService) BatchAddAttendance(operate domain.OperateInfo, param []importAttendance) (
  108 + failRows []interface{}, err error) {
  109 + transactionContext, err := factory.CreateTransactionContext(nil)
  110 + if err != nil {
  111 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  112 + }
  113 + if err := transactionContext.StartTransaction(); err != nil {
  114 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  115 + }
  116 + defer func() {
  117 + transactionContext.RollbackTransaction()
  118 + }()
  119 + //获取当前操作人
  120 + userSrv := domainService.NewUserService()
  121 + // operateUser, err := userSrv.User(operate.UserId)
  122 + // if err != nil {
  123 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, "查询操作人数据失败。"+err.Error())
  124 + // }
  125 + //获取当前操作人的组织
  126 + var org *domain.Org
  127 + org, err = userSrv.Organization(operate.OrgId)
  128 + if err != nil {
  129 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  130 + }
  131 +
  132 + //车间数据
  133 + //生产班组 数据
  134 + productGroupRepo, _ := factory.CreateProductGroupRepository(map[string]interface{}{
  135 + "transactionContext": transactionContext,
  136 + })
  137 +
  138 + _, productGroupList, err := productGroupRepo.Find(map[string]interface{}{
  139 + "companyId": operate.CompanyId,
  140 + "orgId": operate.OrgId,
  141 + })
  142 + if err != nil {
  143 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  144 + }
  145 +
  146 + //车间数据
  147 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  148 + "transactionContext": transactionContext,
  149 + })
  150 +
  151 + //获取车间列表
  152 + _, workshopList, err := workshopRepo.Find(map[string]interface{}{
  153 + "companyId": operate.CompanyId,
  154 + "orgId": operate.OrgId,
  155 + })
  156 + if err != nil {
  157 + return nil, application.ThrowError(application.BUSINESS_ERROR, "获取车间列表失败"+err.Error())
  158 + }
  159 + //车间名称+/+工人名 作为键名
  160 + workerMap := map[string][]*domain.User{}
  161 + for _, v := range productGroupList {
  162 + for _, vv := range v.GroupMembers {
  163 + k := v.WorkStation.WorkshopName + "/" + vv.UserName
  164 + isIn := false
  165 + for _, vvv := range workerMap[k] {
  166 + if vvv.UserId == vv.UserId {
  167 + isIn = true
  168 + break
  169 + }
  170 + }
  171 + if !isIn {
  172 + workerMap[k] = append(workerMap[k], vv)
  173 + }
  174 + }
  175 + }
  176 +
  177 + //车间名称+/+线别名称+/+工段名称 作为键名
  178 + workStationMap := map[string]*domain.WorkStation{}
  179 + for _, v := range workshopList {
  180 + for _, v2 := range v.ProductLines {
  181 + for _, v3 := range v2.ProductSections {
  182 + workStationName := strings.Join([]string{
  183 + v.WorkshopName, v2.LineName, v3.SectionName,
  184 + }, "/")
  185 + workStationMap[workStationName] = domain.NewWorkStation(v, v2, v3)
  186 + }
  187 + }
  188 + }
  189 + var attendanceList []*domain.ProductAttendanceRecord
  190 + nowTime := time.Now()
  191 + //检查导入的数据
  192 + for i := range param {
  193 + //检查字段值
  194 + err := param[i].validField()
  195 + if err != nil {
  196 + param[i].FailReason = err.Error()
  197 + failRows = append(failRows, param[i])
  198 + continue
  199 + }
  200 + //检查日期格式
  201 + productDate, err := time.ParseInLocation("2006-01-02", param[i].ProductDate, time.Local)
  202 + if err != nil {
  203 + param[i].FailReason = "日期格式错误,例 2006-01-02。"
  204 + failRows = append(failRows, param[i])
  205 + continue
  206 + }
  207 + //检查类型
  208 + attendanceType := 0
  209 + // 考勤类型 1.正常 2.支援
  210 + if param[i].AttendanceType == "支援" {
  211 + attendanceType = 1
  212 + } else if param[i].AttendanceType == "正常" {
  213 + attendanceType = 2
  214 + } else {
  215 + param[i].FailReason = "类型内容异常。"
  216 + failRows = append(failRows, param[i])
  217 + continue
  218 + }
  219 + //检查上岗时间格式
  220 + signInStr := fmt.Sprintf("%s %s", param[i].ProductDate, param[i].SignIn)
  221 + signIn, err := time.ParseInLocation("2006-01-02 15:04:05", signInStr, time.Local)
  222 + if err != nil {
  223 + param[i].FailReason = "上岗时间格式错误,例 15:04:05。"
  224 + failRows = append(failRows, param[i])
  225 + continue
  226 + }
  227 +
  228 + //检查离岗时间格式
  229 + signOutStr := fmt.Sprintf("%s %s", param[i].ProductDate, param[i].SignOut)
  230 + signOut, err := time.ParseInLocation("2006-01-02 15:04:05", signOutStr, time.Local)
  231 + if err != nil {
  232 + param[i].FailReason = "离岗时间格式错误,例 15:04:05。"
  233 + failRows = append(failRows, param[i])
  234 + continue
  235 + }
  236 + //检查员工姓名
  237 + var worker *domain.User
  238 + workKey := param[i].WorkshopName + "/" + param[i].WorkerName
  239 + if u, ok := workerMap[workKey]; ok {
  240 + if len(u) > 1 {
  241 + param[i].FailReason = "当前车间存在重复的用户名"
  242 + failRows = append(failRows, param[i])
  243 + continue
  244 + }
  245 + worker = u[0]
  246 + } else {
  247 + param[i].FailReason = "当前车间不存在用户" + param[i].WorkerName
  248 + failRows = append(failRows, param[i])
  249 + continue
  250 + }
  251 + //检查工位
  252 + var workStation *domain.WorkStation
  253 + workStationName := param[i].WorkshopName + "/" + param[i].LineName + "/" + param[i].SectionName
  254 + if v, ok := workStationMap[workStationName]; ok {
  255 + workStation = v
  256 + } else {
  257 + param[i].FailReason = "车间、线别、工段不存在"
  258 + failRows = append(failRows, param[i])
  259 + continue
  260 + }
  261 + //休息时间(小时)
  262 + beakTime, err := strconv.ParseFloat(param[i].BreakTime, 64)
  263 + if err != nil {
  264 + param[i].FailReason = "休息时长填写错误"
  265 + failRows = append(failRows, param[i])
  266 + continue
  267 + }
  268 +
  269 + tempItem := &domain.ProductAttendanceRecord{
  270 + ProductAttendanceId: 0,
  271 + CompanyId: operate.CompanyId,
  272 + OrgId: operate.OrgId,
  273 + AttendanceType: attendanceType,
  274 + ProductWorker: worker,
  275 + WorkStation: workStation,
  276 + SignIn: signIn,
  277 + SignOut: signOut,
  278 + AttendanceStatus: domain.AttendanceAutoApproved, //自动审核
  279 + WorkTimeBefore: 0.0,
  280 + WorkTimeAfter: 0.0,
  281 + CreatedAt: nowTime,
  282 + UpdatedAt: nowTime,
  283 + DeletedAt: time.Time{},
  284 + ProductDate: productDate,
  285 + Ext: &domain.Ext{
  286 + OrgName: org.OrgName,
  287 + DeviceExt: &domain.DeviceExt{},
  288 + ProductPlanExt: &domain.ProductPlanExt{},
  289 + AttendanceExt: &domain.ProductAttendanceRecordExt{},
  290 + },
  291 + }
  292 + //计算工时
  293 + workTime := tempItem.ComputeWorkTime(beakTime)
  294 + tempItem.WorkTimeAfter = workTime
  295 + tempItem.WorkTimeBefore = workTime
  296 + attendanceList = append(attendanceList, tempItem)
  297 + }
  298 + if len(failRows) > 0 {
  299 + return failRows, nil
  300 + }
  301 + attendanceRepo, _ := factory.CreateProductAttendanceRecordRepository(map[string]interface{}{
  302 + "transactionContext": transactionContext,
  303 + })
  304 + for i := range attendanceList {
  305 + _, err = attendanceRepo.Save(attendanceList[i])
  306 + if err != nil {
  307 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  308 + }
  309 + }
  310 + if err := transactionContext.CommitTransaction(); err != nil {
  311 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  312 + }
  313 + return nil, nil
  314 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/utils/excel"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  7 + productRecordCommand "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
  8 + productRecordService "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter"
  10 +)
  11 +
  12 +// ImportProductCapacities 导入产能数据
  13 +func (srv ExcelDataService) ImportProductCapacities(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  14 + excelImport := excel.NewExcelImport()
  15 + excelImport.RowBegin = 3 //第二行开始读取
  16 + excelImport.DataFields = []excel.DataField{
  17 + {EnName: "recordDate", CnName: "日期"},
  18 + {EnName: "workshopName", CnName: "车间"},
  19 + {EnName: "lineName", CnName: "线别"},
  20 + {EnName: "sectionName", CnName: "工段"},
  21 + {EnName: "workOn", CnName: "班别"},
  22 + {EnName: "workerName", CnName: "姓名"},
  23 + {EnName: "batchNumber", CnName: "批次号"},
  24 + {EnName: "weigh", CnName: "产量(kg)"},
  25 + }
  26 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  27 + if err != nil {
  28 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  29 + }
  30 + items := make([]productRecordCommand.BatchAddProductCapacitiesCmd, 0, len(excelData))
  31 + item := productRecordCommand.BatchAddProductCapacitiesCmd{}
  32 + for _, v := range excelData {
  33 + item = productRecordCommand.BatchAddProductCapacitiesCmd{
  34 + RecordDate: v["recordDate"],
  35 + WorkshopName: v["workshopName"],
  36 + LineName: v["lineName"],
  37 + SectionName: v["sectionName"],
  38 + WorkerName: v["workerName"],
  39 + BatchNumber: v["batchNumber"],
  40 + WorkOn: v["workOn"],
  41 + Weigh: v["weigh"],
  42 + FailReason: "",
  43 + }
  44 + items = append(items, item)
  45 + }
  46 +
  47 + svr := productRecordService.NewProductRecordService(nil)
  48 + failRows, err := svr.BatchAddProductCapacities(importDataCommand.Operator, items)
  49 + if err != nil {
  50 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  51 + }
  52 + return srv.importResultWithHeader(excelImport.DataFields, failRows, len(items)), nil
  53 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/utils/excel"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  7 + productRecordCommand "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
  8 + productRecordService "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter"
  10 +)
  11 +
  12 +// ImportProductRecord 导入二级品生产记录
  13 +func (srv ExcelDataService) ImportProductRecord(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  14 + excelImport := excel.NewExcelImport()
  15 + excelImport.RowBegin = 3 //第二行开始读取
  16 + excelImport.DataFields = []excel.DataField{
  17 + {EnName: "createdDate", CnName: "日期"},
  18 + {EnName: "workshopName", CnName: "车间"},
  19 + {EnName: "lineName", CnName: "线别"},
  20 + {EnName: "sectionName", CnName: "工段"},
  21 + {EnName: "workerName", CnName: "姓名"},
  22 + {EnName: "batchNumber", CnName: "批次号"},
  23 + {EnName: "weigh", CnName: "二级品重量"},
  24 + }
  25 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  26 + if err != nil {
  27 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  28 + }
  29 + items := make([]productRecordCommand.BatchAddProductRecordCommand, 0, len(excelData))
  30 + item := productRecordCommand.BatchAddProductRecordCommand{}
  31 + for _, v := range excelData {
  32 + item = productRecordCommand.BatchAddProductRecordCommand{
  33 + CreatedDate: v["createdDate"],
  34 + WorkshopName: v["workshopName"],
  35 + LineName: v["lineName"],
  36 + SectionName: v["sectionName"],
  37 + WorkerName: v["workerName"],
  38 + BatchNumber: v["batchNumber"],
  39 + Weigh: v["weigh"],
  40 + FailReason: "",
  41 + }
  42 + items = append(items, item)
  43 + }
  44 +
  45 + svr := productRecordService.NewProductRecordService(nil)
  46 + failRows, err := svr.BatchAddProductRecord(importDataCommand.Operator, items)
  47 + if err != nil {
  48 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  49 + }
  50 + return srv.importResultWithHeader(excelImport.DataFields, failRows, len(items)), nil
  51 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/utils/excel"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  7 + productTroubleCommand "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/command"
  8 + productTroubleService "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/service"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter"
  10 +)
  11 +
  12 +// ImportProductTrouble 导入事故记录
  13 +func (srv ExcelDataService) ImportProductTrouble(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  14 + excelImport := excel.NewExcelImport()
  15 + excelImport.RowBegin = 3 //第二行开始读取
  16 + excelImport.DataFields = []excel.DataField{
  17 + {EnName: "recordDate", CnName: "日期"},
  18 + {EnName: "workshopName", CnName: "车间"},
  19 + {EnName: "lineName", CnName: "线别"},
  20 + {EnName: "sectionName", CnName: "工段"},
  21 + {EnName: "workerName", CnName: "姓名"},
  22 + {EnName: "typesName", CnName: "事故类型"},
  23 + {EnName: "amountLoss", CnName: "损失金额"},
  24 + }
  25 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  26 + if err != nil {
  27 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  28 + }
  29 + items := make([]productTroubleCommand.BatchAddProductTroubleCommand, 0, len(excelData))
  30 + item := productTroubleCommand.BatchAddProductTroubleCommand{}
  31 + for _, v := range excelData {
  32 + item = productTroubleCommand.BatchAddProductTroubleCommand{
  33 + RecordDate: v["recordDate"],
  34 + WorkshopName: v["workshopName"],
  35 + LineName: v["lineName"],
  36 + SectionName: v["sectionName"],
  37 + WorkerName: v["workerName"],
  38 + AmountLoss: v["amountLoss"],
  39 + TypesName: v["typesName"],
  40 + FailReason: "",
  41 + }
  42 + items = append(items, item)
  43 + }
  44 + svr := productTroubleService.NewProductTroubleService(nil)
  45 + failRows, err := svr.BatchAddProductTrouble(importDataCommand.Operator, items)
  46 + if err != nil {
  47 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  48 + }
  49 + return srv.importResultWithHeader(excelImport.DataFields, failRows, len(items)), nil
  50 +}
@@ -157,3 +157,35 @@ func CreateProductMaterialRepository(options map[string]interface{}) (domain.Pro @@ -157,3 +157,35 @@ func CreateProductMaterialRepository(options map[string]interface{}) (domain.Pro
157 } 157 }
158 return repository.NewProductMaterialRepository(transactionContext) 158 return repository.NewProductMaterialRepository(transactionContext)
159 } 159 }
  160 +
  161 +func CreateRewardStandardRepository(options map[string]interface{}) (domain.RewardStandardRepository, error) {
  162 + var transactionContext *pg.TransactionContext
  163 + if value, ok := options["transactionContext"]; ok {
  164 + transactionContext = value.(*pg.TransactionContext)
  165 + }
  166 + return repository.NewRewardStandardRepository(transactionContext)
  167 +}
  168 +
  169 +func CreateRewardRuleRepository(options map[string]interface{}) (domain.RewardRuleRepository, error) {
  170 + var transactionContext *pg.TransactionContext
  171 + if value, ok := options["transactionContext"]; ok {
  172 + transactionContext = value.(*pg.TransactionContext)
  173 + }
  174 + return repository.NewRewardRuleRepository(transactionContext)
  175 +}
  176 +
  177 +func CreateProductTroubleRepository(options map[string]interface{}) (domain.ProductTroubleRepository, error) {
  178 + var transactionContext *pg.TransactionContext
  179 + if value, ok := options["transactionContext"]; ok {
  180 + transactionContext = value.(*pg.TransactionContext)
  181 + }
  182 + return repository.NewProductTroubleRepository(transactionContext)
  183 +}
  184 +
  185 +func CreateRewardSummaryRepository(options map[string]interface{}) (domain.RewardSummaryRepository, error) {
  186 + var transactionContext *pg.TransactionContext
  187 + if value, ok := options["transactionContext"]; ok {
  188 + transactionContext = value.(*pg.TransactionContext)
  189 + }
  190 + return repository.NewRewardSummaryRepository(transactionContext)
  191 +}
  1 +package command
  2 +
  3 +import "errors"
  4 +
  5 +type BatchAddProductCapacitiesCmd struct {
  6 + WorkshopName string `json:"workshopName"` //车间
  7 + LineName string `json:"lineName"` //生产线
  8 + SectionName string `json:"sectionName"` //工段
  9 + WorkerName string `json:"workerName"` //员工
  10 + Weigh string `json:"weigh"` //产量重量
  11 + BatchNumber string `json:"batchNumber"` //计划 批次号
  12 + RecordDate string `json:"recordDate"` //日期 2006-01-02
  13 + WorkOn string `json:"workOn"` //上班班次 1:全天 2:白班 4:中班 8:夜班
  14 + FailReason string `json:"failReason"`
  15 +}
  16 +
  17 +func (data *BatchAddProductCapacitiesCmd) ValidField() error {
  18 + if len(data.RecordDate) == 0 {
  19 + return errors.New("日期未填写")
  20 + }
  21 + if len(data.WorkshopName) == 0 {
  22 + return errors.New("车间未填写")
  23 + }
  24 + if len(data.LineName) == 0 {
  25 + return errors.New("生产线未填写")
  26 + }
  27 + if len(data.SectionName) == 0 {
  28 + return errors.New("工段未填写")
  29 + }
  30 + if len(data.WorkerName) == 0 {
  31 + return errors.New("姓名未填写")
  32 + }
  33 + if len(data.BatchNumber) == 0 {
  34 + return errors.New("批次未填写")
  35 + }
  36 + if len(data.Weigh) == 0 {
  37 + return errors.New("重量未填写")
  38 + }
  39 + if len(data.WorkOn) == 0 {
  40 + return errors.New("上班班次未填写")
  41 + }
  42 + return nil
  43 +}
  1 +package command
  2 +
  3 +import "errors"
  4 +
  5 +// 批量添加生产记录,二级品
  6 +type BatchAddProductRecordCommand struct {
  7 + CreatedDate string `json:"createdDate"` // 日期
  8 + WorkshopName string `json:"workshopName"` // 车间
  9 + LineName string `json:"lineName"` // 生产线
  10 + SectionName string `json:"sectionName"` // 工段
  11 + WorkerName string `json:"workerName"` // 工人名称
  12 + BatchNumber string `json:"batchNumber"` // 批次
  13 + Weigh string `json:"weigh"` // 重量
  14 + FailReason string `json:"failReason"` // 数据检查失败的原因
  15 +}
  16 +
  17 +func (cmd *BatchAddProductRecordCommand) ValidField() error {
  18 + if len(cmd.CreatedDate) == 0 {
  19 + return errors.New("日期未填写")
  20 + }
  21 + if len(cmd.WorkshopName) == 0 {
  22 + return errors.New("车间未填写")
  23 + }
  24 + if len(cmd.LineName) == 0 {
  25 + return errors.New("生产线未填写")
  26 + }
  27 + if len(cmd.SectionName) == 0 {
  28 + return errors.New("工段未填写")
  29 + }
  30 + if len(cmd.WorkerName) == 0 {
  31 + return errors.New("姓名未填写")
  32 + }
  33 + if len(cmd.BatchNumber) == 0 {
  34 + return errors.New("批次号未填写")
  35 + }
  36 + if len(cmd.Weigh) == 0 {
  37 + return errors.New("重量未填写")
  38 + }
  39 + return nil
  40 +}
  1 +package command
  2 +
  3 +type CreateProductCapacitiesCmd struct {
  4 + // 车间ID
  5 + WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"`
  6 + // 生产线ID
  7 + LineId int `cname:"生产线ID" json:"lineId" valid:"Required"`
  8 + // 工段ID
  9 + SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"`
  10 + //员工
  11 + WorkerId []int `cname:"工人ID" json:"workerId" valid:"Required"`
  12 + //产量重量
  13 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required" `
  14 + //计划id
  15 + ProductPlanId int `json:"productPlanId"`
  16 + //日期
  17 + RecordDate string `json:"recordDate"`
  18 + //上班班次 1:全天 2:白班 4:中班 8:夜班
  19 + WorkOn int `json:"workOn"`
  20 + //保存并审核
  21 + SaveAndApprove bool `json:"saveAndApprove"`
  22 +}
@@ -9,12 +9,28 @@ import ( @@ -9,12 +9,28 @@ import (
9 ) 9 )
10 10
11 type CreateProductRecordCommand struct { 11 type CreateProductRecordCommand struct {
12 - // 生产记录ID  
13 - ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` 12 +
  13 + // 车间ID
  14 + WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"`
  15 + // 生产线ID
  16 + LineId int `cname:"生产线ID" json:"lineId" valid:"Required"`
  17 + // 工段ID
  18 + SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"`
  19 +
  20 + WorkerId []int `cname:"工人ID" json:"workerId" valid:"Required"`
  21 +
  22 + //生气计划id
  23 + ProductPlanId int `cname:"生气计划id" json:"productPlanId" valid:"Required"`
  24 +
  25 + CreatedDate string `cname:"日期" json:"createdDate" valid:"Required"`
  26 + //重量
  27 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required" `
  28 + //保存并审核
  29 + SaveAndApprove bool `json:"saveAndApprove"`
14 } 30 }
15 31
16 func (createProductRecordCommand *CreateProductRecordCommand) Valid(validation *validation.Validation) { 32 func (createProductRecordCommand *CreateProductRecordCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 33 +
18 } 34 }
19 35
20 func (createProductRecordCommand *CreateProductRecordCommand) ValidateCommand() error { 36 func (createProductRecordCommand *CreateProductRecordCommand) ValidateCommand() error {
  1 +package command
  2 +
  3 +type SaveProductCapacitiesCmd struct {
  4 + //id
  5 + ProductRecordId int `json:"productRecordId"`
  6 + // 车间ID
  7 + WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"`
  8 + // 生产线ID
  9 + LineId int `cname:"生产线ID" json:"lineId" valid:"Required"`
  10 + // 工段ID
  11 + SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"`
  12 + //员工
  13 + WorkerId int `cname:"工人ID" json:"workerId" valid:"Required"`
  14 + //产量重量
  15 + Weigh float64 `cname:"重量" json:"weigh" valid:"Required" `
  16 + //计划id
  17 + ProductPlanId int `json:"productPlanId"`
  18 + //日期
  19 + RecordDate string `json:"recordDate"`
  20 + //上班班次 1:全天 2:白班 4:中班 8:夜班
  21 + WorkOn int `json:"workOn"`
  22 + //保存并审核
  23 + SaveAndApprove bool `json:"saveAndApprove"`
  24 +}
  1 +package dto
  2 +
  3 +//产能管理-列表
  4 +type ProductCapacitiesList struct {
  5 + ProductRecordId int `json:"productRecordId"`
  6 + WorkshopName string `json:"workshopName"` //车间名称
  7 + LineName string `json:"lineName"` //线别名称
  8 + SectionName string `json:"sectionName"` //工段
  9 + WorkerName string `json:"workerName"` // 用户姓名
  10 + EmployeeType int `json:"employeeType"` // 员工类型 1:固定 2:派遣 3.临时
  11 + ProductName string `json:"productName"` //品名
  12 + WorkerOn int `json:"workerOn"` //班别
  13 + ProductWeigh float64 `json:"productWeigh"` // 产能
  14 + CreatedAt string `json:"createdAt"` // 创建时间
  15 + ApproveStatus int `json:"approveStatus"` //0:未审核 1:已审核 2.自动审核
  16 +}
  17 +
  18 +//产能管理-列表-详情
  19 +type ProductCapacitiesInfo struct {
  20 + ProductRecordId int `json:"id"`
  21 + WorkshopId int `json:"workshopId" ` // 车间ID
  22 + WorkshopName string `json:"workshopName"` //
  23 + LineId int `json:"lineId"` // 生产线ID
  24 + LineName string `json:"lineName"` //
  25 + SectionId int `json:"sectionId" ` // 工段ID
  26 + SectionName string `json:"sectionName"` //
  27 + WorkerId int `json:"workerId" ` //员工
  28 + WorkerName string `json:"workerName"` //
  29 + Weigh float64 `json:"weigh"` //产量重量
  30 + ProductPlanId int `json:"productPlanId"` //
  31 + BatchNumber string `json:"batchNumber"` //批次号
  32 + ProductName string `json:"productName"` //产品名称
  33 + ParticipateType int `json:"participateType"` //参与类型 1:正常 2:支援
  34 + RecordDate string `json:"recordDate"` //日期
  35 + WorkOn int `json:"workOn"` //上班班次 1:全天 2:白班 4:中班 8:夜班
  36 +}
  1 +package query
  2 +
  3 +type GetProductCapacitiesQuery struct {
  4 + EmployeeProductRecordId int `json:"id"`
  5 +}
  1 +package query
  2 +
  3 +type ListProductCapacitiesQuery struct {
  4 + PageNumber int `json:"pageNumber"`
  5 + PageSize int `json:"pageSize"`
  6 + CompanyId int `json:"companyId"`
  7 + OrgId int `json:"orgId"`
  8 + WorkshopName string `json:"workshopName"`
  9 + LineName string `json:"lineName"`
  10 + SectionName string `json:"sectionName"`
  11 + ProductBeginTime string `json:"productBeginTime"`
  12 + ProductEndTime string `json:"productEndTime"`
  13 + WorkerName string `json:"workerName"`
  14 +}
  1 +package service
  2 +
  3 +import (
  4 + "strconv"
  5 + "strings"
  6 + "time"
  7 +
  8 + "github.com/linmadan/egglib-go/core/application"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/dto"
  12 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  15 +)
  16 +
  17 +//产能管理
  18 +
  19 +// 产能管理 页面上手动创建员工生产记录
  20 +func (productRecordService *ProductRecordService) SaveProductCapacities(operateInfo *domain.OperateInfo, param *command.SaveProductCapacitiesCmd) (map[string]interface{}, error) {
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  27 + }
  28 + defer func() {
  29 + transactionContext.RollbackTransaction()
  30 + }()
  31 +
  32 + //日期
  33 + recordDate, err := time.Parse("2006-01-02", param.RecordDate)
  34 + if err != nil {
  35 + return nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  36 + }
  37 + //员工数据
  38 + var worker *domain.User
  39 + userService := domainService.NewUserService()
  40 + worker, err = userService.User(param.WorkerId)
  41 + if err != nil {
  42 + return nil, application.ThrowError(application.ARG_ERROR, "获取员工错误,"+err.Error())
  43 + }
  44 + //操作人数据
  45 + var user *domain.User
  46 + user, err = userService.User(operateInfo.UserId)
  47 + if err != nil {
  48 + return nil, application.ThrowError(application.ARG_ERROR, "获取操作人错误,"+err.Error())
  49 + }
  50 + //组织数据
  51 + var org *domain.Org
  52 + org, err = userService.Organization(operateInfo.OrgId)
  53 + if err != nil {
  54 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  55 + }
  56 + //车间数据
  57 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  58 + "transactionContext": transactionContext,
  59 + })
  60 + workshop, err := workshopRepo.FindOne(map[string]interface{}{"workshopId": param.WorkshopId})
  61 + if err != nil {
  62 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间数据失败"+err.Error())
  63 + }
  64 + workstation, err := workshop.FindWorkStation(param.WorkshopId, param.LineId, param.SectionId)
  65 + if err != nil {
  66 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间工段数据失败"+err.Error())
  67 + }
  68 +
  69 + //获取生产记录
  70 + productPlanRepo, _ := factory.CreateProductPlanRepository(map[string]interface{}{
  71 + "transactionContext": transactionContext,
  72 + })
  73 +
  74 + planData, err := productPlanRepo.FindOne(map[string]interface{}{
  75 + "productPlanId": param.ProductPlanId,
  76 + })
  77 +
  78 + if err != nil {
  79 + return nil, application.ThrowError(application.ARG_ERROR, "获取计划任务数据失败"+err.Error())
  80 + }
  81 +
  82 + //员工生产记录
  83 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  84 + "transactionContext": transactionContext,
  85 + })
  86 +
  87 + nowTime := time.Now()
  88 + if param.ProductRecordId > 0 {
  89 + productRecord, err := productRecordRepo.FindOne(map[string]interface{}{
  90 + "productRecordId": param.ProductRecordId,
  91 + })
  92 + if err != nil {
  93 + return nil, application.ThrowError(application.ARG_ERROR, "获取生产记录数据失败"+err.Error())
  94 + }
  95 + if productRecord.ProductRecordInfo.ApproveStatus != domain.ProductRecordNotApprove {
  96 + return nil, application.ThrowError(application.ARG_ERROR, "生产记录不可再被编辑")
  97 + }
  98 + }
  99 + epRecord := &domain.ProductRecord{
  100 + ProductRecordId: param.ProductRecordId,
  101 + UpdatedAt: nowTime,
  102 + OrgId: operateInfo.OrgId,
  103 + CompanyId: operateInfo.CompanyId,
  104 + WorkStation: workstation,
  105 + ProductWorker: worker,
  106 + CreatedAt: recordDate,
  107 + Ext: &domain.Ext{
  108 + Operator: user,
  109 + OrgName: org.OrgName,
  110 + },
  111 + ProductRecordType: domain.RecordTypeReceiveMaterial,
  112 + ProductRecordInfo: &domain.ProductRecordInfo{
  113 + WorkOn: param.WorkOn,
  114 + ProductDate: param.RecordDate,
  115 + Weigh: param.Weigh,
  116 + WeighBefore: param.Weigh,
  117 + ApproveStatus: domain.ProductRecordNotApprove,
  118 + ApproveAt: 0,
  119 + ApproveUser: nil,
  120 + ProductPlanId: planData.ProductPlanId,
  121 + PlanProductName: planData.PlanProductName,
  122 + BatchNumber: planData.BatchNumber,
  123 + },
  124 + }
  125 + if param.SaveAndApprove {
  126 + epRecord.ProductRecordInfo.ApproveAt = nowTime.Unix()
  127 + epRecord.ProductRecordInfo.ApproveStatus = domain.ProductRecordApproved
  128 + epRecord.ProductRecordInfo.ApproveUser = user
  129 + }
  130 + _, err = productRecordRepo.Save(epRecord)
  131 + if err != nil {
  132 + return nil, application.ThrowError(application.ARG_ERROR, "保存员工生产记录失败"+err.Error())
  133 + }
  134 + if param.SaveAndApprove {
  135 + _ = domainService.SendProductRecordStaticsJob(epRecord)
  136 + }
  137 + if err := transactionContext.CommitTransaction(); err != nil {
  138 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  139 + }
  140 + return map[string]interface{}{
  141 + "productRecordId": epRecord.ProductRecordId,
  142 + }, nil
  143 +}
  144 +
  145 +// 产能管理 列表
  146 +func (productRecordService *ProductRecordService) ListProductCapacities(operateInfo *domain.OperateInfo, param *query.ListProductCapacitiesQuery) (int64, []dto.ProductCapacitiesList, error) {
  147 + transactionContext, err := factory.CreateTransactionContext(nil)
  148 + if err != nil {
  149 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  150 + }
  151 + if err := transactionContext.StartTransaction(); err != nil {
  152 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  153 + }
  154 + defer func() {
  155 + transactionContext.RollbackTransaction()
  156 + }()
  157 +
  158 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  159 + "transactionContext": transactionContext,
  160 + })
  161 +
  162 + productBeginTime, _ := time.ParseInLocation("2006-01-02", param.ProductBeginTime, time.Local)
  163 + productEndTime, _ := time.ParseInLocation("2006-01-02", param.ProductEndTime, time.Local)
  164 + if !productEndTime.IsZero() {
  165 + productEndTime.Add((86400 - 1) * time.Second)
  166 + }
  167 + condition := map[string]interface{}{
  168 + "companyId": param.CompanyId,
  169 + "orgId": param.OrgId,
  170 + "userName": param.WorkerName,
  171 + "workshopName": param.WorkshopName,
  172 + "lineName": param.LineName,
  173 + "sectionName": param.SectionName,
  174 + "productBeginTime": productBeginTime,
  175 + "productEndTime": productEndTime,
  176 + }
  177 +
  178 + limit := param.PageSize
  179 + offset := param.PageSize * (param.PageNumber - 1)
  180 + if limit >= 0 {
  181 + condition["limit"] = limit
  182 + }
  183 + if offset >= 0 {
  184 + condition["offset"] = offset
  185 + }
  186 + count, productRecords, err := productRecordRepo.Find(condition)
  187 + if err != nil {
  188 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  189 + }
  190 + if err := transactionContext.CommitTransaction(); err != nil {
  191 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  192 + }
  193 +
  194 + var result = make([]dto.ProductCapacitiesList, 0)
  195 + for _, v := range productRecords {
  196 + item := dto.ProductCapacitiesList{
  197 + ProductRecordId: v.ProductRecordId,
  198 + WorkshopName: v.WorkStation.WorkshopName,
  199 + LineName: v.WorkStation.LineName,
  200 + SectionName: v.WorkStation.SectionName,
  201 + WorkerName: v.ProductWorker.UserName,
  202 + EmployeeType: v.ProductWorker.EmployeeType,
  203 + ProductName: v.ProductRecordInfo.PlanProductName,
  204 + WorkerOn: v.ProductRecordInfo.WorkOn,
  205 + ProductWeigh: v.ProductRecordInfo.Weigh,
  206 + CreatedAt: v.CreatedAt.Local().Format("2006-01-02"),
  207 + ApproveStatus: v.ProductRecordInfo.ApproveStatus,
  208 + }
  209 + result = append(result, item)
  210 + }
  211 + return count, result, nil
  212 +}
  213 +
  214 +// 产能管理 列表-详情
  215 +func (productRecordService *ProductRecordService) GetProductCapacities(operateInfo *domain.OperateInfo, id int) (*dto.ProductCapacitiesInfo, error) {
  216 + transactionContext, err := factory.CreateTransactionContext(nil)
  217 + if err != nil {
  218 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  219 + }
  220 + if err := transactionContext.StartTransaction(); err != nil {
  221 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  222 + }
  223 + defer func() {
  224 + transactionContext.RollbackTransaction()
  225 + }()
  226 +
  227 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  228 + "transactionContext": transactionContext,
  229 + })
  230 +
  231 + recordData, err := productRecordRepo.FindOne(map[string]interface{}{
  232 + "productRecordId": id,
  233 + })
  234 + if err != nil {
  235 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  236 + }
  237 +
  238 + if err := transactionContext.CommitTransaction(); err != nil {
  239 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  240 + }
  241 +
  242 + var result = dto.ProductCapacitiesInfo{
  243 + ProductRecordId: recordData.ProductRecordId,
  244 + WorkshopId: recordData.WorkStation.WorkshopId,
  245 + WorkshopName: recordData.WorkStation.WorkshopName,
  246 + LineId: recordData.WorkStation.LineId,
  247 + LineName: recordData.WorkStation.LineName,
  248 + SectionId: recordData.WorkStation.SectionId,
  249 + SectionName: recordData.WorkStation.SectionName,
  250 + WorkerId: recordData.ProductWorker.UserId,
  251 + WorkerName: recordData.ProductWorker.UserName,
  252 + Weigh: recordData.ProductRecordInfo.Weigh,
  253 + BatchNumber: recordData.ProductRecordInfo.BatchNumber,
  254 + ProductName: recordData.ProductRecordInfo.PlanProductName,
  255 + ProductPlanId: recordData.ProductRecordInfo.ProductPlanId,
  256 + RecordDate: recordData.CreatedAt.Format("2006-01-02"),
  257 + WorkOn: recordData.ProductRecordInfo.WorkOn,
  258 + }
  259 +
  260 + return &result, nil
  261 +}
  262 +
  263 +// 产能管理 列表-删除
  264 +func (productRecordService *ProductRecordService) DeleteProductCapacities(operateInfo *domain.OperateInfo, id int) (map[string]interface{}, error) {
  265 + transactionContext, err := factory.CreateTransactionContext(nil)
  266 + if err != nil {
  267 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  268 + }
  269 + if err := transactionContext.StartTransaction(); err != nil {
  270 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  271 + }
  272 + defer func() {
  273 + transactionContext.RollbackTransaction()
  274 + }()
  275 +
  276 + eProductRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  277 + "transactionContext": transactionContext,
  278 + })
  279 +
  280 + recordData, err := eProductRecordRepo.FindOne(map[string]interface{}{
  281 + "productRecordId": id,
  282 + })
  283 + if err != nil {
  284 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  285 + }
  286 + _, err = eProductRecordRepo.Remove(recordData)
  287 + if err != nil {
  288 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  289 + }
  290 + if err := transactionContext.CommitTransaction(); err != nil {
  291 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  292 + }
  293 +
  294 + return map[string]interface{}{
  295 + "productRecordId": recordData.ProductRecordId,
  296 + }, nil
  297 +}
  298 +
  299 +// 产能管理 列表-审核
  300 +func (productRecordService *ProductRecordService) ApproveProductCapacities(operateInfo *domain.OperateInfo, id int) (map[string]interface{}, error) {
  301 + transactionContext, err := factory.CreateTransactionContext(nil)
  302 + if err != nil {
  303 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  304 + }
  305 + if err := transactionContext.StartTransaction(); err != nil {
  306 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  307 + }
  308 + defer func() {
  309 + transactionContext.RollbackTransaction()
  310 + }()
  311 +
  312 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  313 + "transactionContext": transactionContext,
  314 + })
  315 +
  316 + recordData, err := productRecordRepo.FindOne(map[string]interface{}{
  317 + "productRecordId": id,
  318 + })
  319 + if err != nil {
  320 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  321 + }
  322 +
  323 + userService := domainService.NewUserService()
  324 + //操作人数据
  325 + var user *domain.User
  326 + user, err = userService.User(operateInfo.UserId)
  327 + if err != nil {
  328 + return nil, application.ThrowError(application.ARG_ERROR, "获取操作人错误,"+err.Error())
  329 + }
  330 + err = recordData.Approve(user, recordData.ProductRecordInfo.Weigh, time.Now(), domain.ProductRecordApproved)
  331 + if err != nil {
  332 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  333 + }
  334 + _, err = productRecordRepo.Save(recordData)
  335 + if err != nil {
  336 + return nil, application.ThrowError(application.ARG_ERROR, "保存数据错误,"+err.Error())
  337 + }
  338 + _ = domainService.SendProductRecordStaticsJob(recordData)
  339 + if err := transactionContext.CommitTransaction(); err != nil {
  340 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  341 + }
  342 + return map[string]interface{}{
  343 + "productRecordId": recordData.ProductRecordId,
  344 + }, nil
  345 +}
  346 +
  347 +// 从excel导入 批量添加
  348 +func (srv *ProductRecordService) BatchAddProductCapacities(operate *domain.OperateInfo, dataList []command.BatchAddProductCapacitiesCmd) (
  349 + failRows []interface{}, err error) {
  350 + transactionContext, err := factory.CreateTransactionContext(nil)
  351 + if err != nil {
  352 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  353 + }
  354 + if err := transactionContext.StartTransaction(); err != nil {
  355 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  356 + }
  357 + defer func() {
  358 + transactionContext.RollbackTransaction()
  359 + }()
  360 +
  361 + //获取当前操作人
  362 + userSrv := domainService.NewUserService()
  363 + operateUser, err := userSrv.User(operate.UserId)
  364 + if err != nil {
  365 + return nil, application.ThrowError(application.TRANSACTION_ERROR, "查询操作人数据失败。"+err.Error())
  366 + }
  367 + //获取当前操作人的组织
  368 + var org *domain.Org
  369 + org, err = userSrv.Organization(operate.OrgId)
  370 + if err != nil {
  371 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  372 + }
  373 +
  374 + //生产班组 数据
  375 + productGroupRepo, _ := factory.CreateProductGroupRepository(map[string]interface{}{
  376 + "transactionContext": transactionContext,
  377 + })
  378 +
  379 + //生产计划数据
  380 + productPlanRepo, _ := factory.CreateProductPlanRepository(map[string]interface{}{
  381 + "transactionContext": transactionContext,
  382 + })
  383 +
  384 + _, productGroupList, err := productGroupRepo.Find(map[string]interface{}{
  385 + "companyId": operate.CompanyId,
  386 + "orgId": operate.OrgId,
  387 + })
  388 + if err != nil {
  389 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  390 + }
  391 + //车间数据
  392 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  393 + "transactionContext": transactionContext,
  394 + })
  395 +
  396 + //获取车间列表
  397 + _, workshopList, err := workshopRepo.Find(map[string]interface{}{
  398 + "companyId": operate.CompanyId,
  399 + "orgId": operate.OrgId,
  400 + })
  401 + if err != nil {
  402 + return nil, application.ThrowError(application.BUSINESS_ERROR, "获取车间列表失败"+err.Error())
  403 + }
  404 +
  405 + //车间名称+/+工人名 作为键名
  406 + workerMap := map[string][]*domain.User{}
  407 + for _, v := range productGroupList {
  408 + for _, vv := range v.GroupMembers {
  409 + k := v.WorkStation.WorkshopName + "/" + vv.UserName
  410 + isIn := false
  411 + for _, vvv := range workerMap[k] {
  412 + if vvv.UserId == vv.UserId {
  413 + isIn = true
  414 + break
  415 + }
  416 + }
  417 + if !isIn {
  418 + workerMap[k] = append(workerMap[k], vv)
  419 + }
  420 + }
  421 + }
  422 + //车间名称+/+线别名称+/+工段名称 作为键名
  423 + workStationMap := map[string]*domain.WorkStation{}
  424 + for _, v := range workshopList {
  425 + for _, v2 := range v.ProductLines {
  426 + for _, v3 := range v2.ProductSections {
  427 + workStationName := strings.Join([]string{
  428 + v.WorkshopName, v2.LineName, v3.SectionName,
  429 + }, "/")
  430 + workStationMap[workStationName] = domain.NewWorkStation(v, v2, v3)
  431 + }
  432 + }
  433 + }
  434 + productRecordList := []*domain.ProductRecord{}
  435 +
  436 + nowTime := time.Now()
  437 + for i := range dataList {
  438 + //检查字段
  439 + err = dataList[i].ValidField()
  440 + if err != nil {
  441 + dataList[i].FailReason = err.Error()
  442 + failRows = append(failRows, dataList[i])
  443 + continue
  444 + }
  445 + //检查日期格式
  446 + productDate, err := time.ParseInLocation("2006-01-02", dataList[i].RecordDate, time.Local)
  447 + if err != nil {
  448 + dataList[i].FailReason = "日期格式错误,例 2006-01-02。"
  449 + failRows = append(failRows, dataList[i])
  450 + continue
  451 + }
  452 + //检查工位
  453 + var workStation *domain.WorkStation
  454 + workStationName := dataList[i].WorkshopName + "/" + dataList[i].LineName + "/" + dataList[i].SectionName
  455 + if v, ok := workStationMap[workStationName]; ok {
  456 + workStation = v
  457 + } else {
  458 + dataList[i].FailReason = "车间、线别、工段不存在"
  459 + failRows = append(failRows, dataList[i])
  460 + continue
  461 + }
  462 +
  463 + //检查员工姓名
  464 + var worker *domain.User
  465 + workKey := dataList[i].WorkshopName + "/" + dataList[i].WorkerName
  466 + if u, ok := workerMap[workKey]; ok {
  467 + if len(u) > 1 {
  468 + dataList[i].FailReason = "当前车间存在重复的用户名"
  469 + failRows = append(failRows, dataList[i])
  470 + continue
  471 + }
  472 + worker = u[0]
  473 + } else {
  474 + dataList[i].FailReason = "当前车间不存在用户" + dataList[i].WorkerName
  475 + failRows = append(failRows, dataList[i])
  476 + continue
  477 + }
  478 + //二级品重量
  479 + weigh, err := strconv.ParseFloat(dataList[i].Weigh, 64)
  480 + if err != nil {
  481 + dataList[i].FailReason = "重量填写错误"
  482 + failRows = append(failRows, dataList[i])
  483 + continue
  484 + }
  485 + //按批次获取生产计划
  486 + productPlanData, err := productPlanRepo.FindOne(map[string]interface{}{
  487 + "batchNumber": dataList[i].BatchNumber,
  488 + "companyId": operate.CompanyId,
  489 + })
  490 + if err != nil {
  491 + dataList[i].FailReason = "批次号不存在"
  492 + failRows = append(failRows, dataList[i])
  493 + continue
  494 + }
  495 + //检查上班班次 1:全天 2:白班 4:中班 8:夜班
  496 + workerOn := 0
  497 + switch dataList[i].WorkOn {
  498 + case "全天":
  499 + workerOn = 1
  500 + case "白班":
  501 + workerOn = 2
  502 + case "中班":
  503 + workerOn = 4
  504 + case "夜班":
  505 + workerOn = 8
  506 + default:
  507 + dataList[i].FailReason = "上班班次 填写错误"
  508 + failRows = append(failRows, dataList[i])
  509 + continue
  510 + }
  511 +
  512 + tempItem := &domain.ProductRecord{
  513 + ProductRecordId: 0,
  514 + CompanyId: operate.CompanyId,
  515 + OrgId: operate.OrgId,
  516 + ProductRecordType: domain.RecordTypeReceiveMaterial,
  517 + ProductWorker: worker,
  518 + WorkStation: workStation,
  519 + CreatedAt: productDate,
  520 + UpdatedAt: nowTime,
  521 + DeletedAt: time.Time{},
  522 + ProductRecordInfo: &domain.ProductRecordInfo{
  523 + ProductDate: productDate.Local().Format("2006-01-02"),
  524 + Original: weigh,
  525 + Weigh: weigh,
  526 + WeighBefore: weigh,
  527 + WeighAfter: weigh,
  528 + ApproveStatus: domain.ProductRecordAutoApproved,
  529 + ApproveAt: nowTime.Unix(),
  530 + ApproveUser: operateUser,
  531 + UnitConversionId: productPlanData.Ext.ProductPlanExt.ProductId,
  532 + ProductPlanId: productPlanData.ProductPlanId,
  533 + PlanProductName: productPlanData.PlanProductName,
  534 + BatchNumber: productPlanData.BatchNumber,
  535 + ProductGroupId: 0,
  536 + WorkOn: workerOn,
  537 + },
  538 + Ext: &domain.Ext{
  539 + Operator: operateUser,
  540 + OrgName: org.OrgName,
  541 + },
  542 + PreRecord: &domain.ProductRecord{},
  543 + }
  544 + productRecordList = append(productRecordList, tempItem)
  545 + }
  546 + if len(failRows) > 0 {
  547 + return failRows, nil
  548 + }
  549 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  550 + "transactionContext": transactionContext,
  551 + })
  552 + for i := range productRecordList {
  553 + _, err := productRecordRepo.Save(productRecordList[i])
  554 + if err != nil {
  555 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  556 + }
  557 + }
  558 + if err := transactionContext.CommitTransaction(); err != nil {
  559 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  560 + }
  561 + return failRows, nil
  562 +}
  563 +
  564 +// 产能管理 页面上手动创建员工生产记录
  565 +func (productRecordService *ProductRecordService) CreateProductCapacities(operateInfo *domain.OperateInfo, param *command.CreateProductCapacitiesCmd) (map[string]interface{}, error) {
  566 + transactionContext, err := factory.CreateTransactionContext(nil)
  567 + if err != nil {
  568 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  569 + }
  570 + if err := transactionContext.StartTransaction(); err != nil {
  571 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  572 + }
  573 + defer func() {
  574 + transactionContext.RollbackTransaction()
  575 + }()
  576 +
  577 + //日期
  578 + recordDate, err := time.Parse("2006-01-02", param.RecordDate)
  579 + if err != nil {
  580 + return nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  581 + }
  582 + userService := domainService.NewUserService()
  583 + //操作人数据
  584 + var user *domain.User
  585 + user, err = userService.User(operateInfo.UserId)
  586 + if err != nil {
  587 + return nil, application.ThrowError(application.ARG_ERROR, "获取操作人错误,"+err.Error())
  588 + }
  589 + //组织数据
  590 + var org *domain.Org
  591 + org, err = userService.Organization(operateInfo.OrgId)
  592 + if err != nil {
  593 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  594 + }
  595 + //车间数据
  596 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  597 + "transactionContext": transactionContext,
  598 + })
  599 + workshop, err := workshopRepo.FindOne(map[string]interface{}{"workshopId": param.WorkshopId})
  600 + if err != nil {
  601 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间数据失败"+err.Error())
  602 + }
  603 + workstation, err := workshop.FindWorkStation(param.WorkshopId, param.LineId, param.SectionId)
  604 + if err != nil {
  605 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间工段数据失败"+err.Error())
  606 + }
  607 +
  608 + //获取生产记录
  609 + productPlanRepo, _ := factory.CreateProductPlanRepository(map[string]interface{}{
  610 + "transactionContext": transactionContext,
  611 + })
  612 +
  613 + planData, err := productPlanRepo.FindOne(map[string]interface{}{
  614 + "productPlanId": param.ProductPlanId,
  615 + })
  616 +
  617 + if err != nil {
  618 + return nil, application.ThrowError(application.ARG_ERROR, "获取计划任务数据失败"+err.Error())
  619 + }
  620 +
  621 + //员工生产记录
  622 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  623 + "transactionContext": transactionContext,
  624 + })
  625 +
  626 + nowTime := time.Now()
  627 + productRecordIds := []int{}
  628 + for _, workerId := range param.WorkerId {
  629 + //员工数据
  630 + worker, err := userService.User(workerId)
  631 + if err != nil {
  632 + return nil, application.ThrowError(application.ARG_ERROR, "获取员工错误,"+err.Error())
  633 + }
  634 + epRecord := &domain.ProductRecord{
  635 + UpdatedAt: nowTime,
  636 + OrgId: operateInfo.OrgId,
  637 + CompanyId: operateInfo.CompanyId,
  638 + WorkStation: workstation,
  639 + ProductWorker: worker,
  640 + CreatedAt: recordDate,
  641 + Ext: &domain.Ext{
  642 + Operator: user,
  643 + OrgName: org.OrgName,
  644 + },
  645 + ProductRecordType: domain.RecordTypeReceiveMaterial,
  646 + ProductRecordInfo: &domain.ProductRecordInfo{
  647 + WorkOn: param.WorkOn,
  648 + ProductDate: param.RecordDate,
  649 + Weigh: param.Weigh,
  650 + WeighBefore: param.Weigh,
  651 + ApproveStatus: domain.ProductRecordNotApprove,
  652 + ApproveAt: 0,
  653 + ApproveUser: nil,
  654 + ProductPlanId: planData.ProductPlanId,
  655 + PlanProductName: planData.PlanProductName,
  656 + BatchNumber: planData.BatchNumber,
  657 + },
  658 + }
  659 + if param.SaveAndApprove {
  660 + epRecord.ProductRecordInfo.ApproveAt = nowTime.Unix()
  661 + epRecord.ProductRecordInfo.ApproveStatus = domain.ProductRecordApproved
  662 + epRecord.ProductRecordInfo.ApproveUser = user
  663 + }
  664 + _, err = productRecordRepo.Save(epRecord)
  665 + if err != nil {
  666 + return nil, application.ThrowError(application.ARG_ERROR, "保存员工生产记录失败"+err.Error())
  667 + }
  668 + if param.SaveAndApprove {
  669 + _ = domainService.SendProductRecordStaticsJob(epRecord)
  670 + }
  671 + productRecordIds = append(productRecordIds, epRecord.ProductRecordId)
  672 + }
  673 + if err := transactionContext.CommitTransaction(); err != nil {
  674 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  675 + }
  676 + return map[string]interface{}{
  677 + "productRecordIds": productRecordIds,
  678 + }, nil
  679 +}
@@ -2,6 +2,12 @@ package service @@ -2,6 +2,12 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "strconv"
  6 + "strings"
  7 + "time"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  10 +
5 "github.com/linmadan/egglib-go/core/application" 11 "github.com/linmadan/egglib-go/core/application"
6 pgTransaction "github.com/linmadan/egglib-go/transaction/pg" 12 pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
7 "github.com/linmadan/egglib-go/utils/tool_funs" 13 "github.com/linmadan/egglib-go/utils/tool_funs"
@@ -12,13 +18,17 @@ import ( @@ -12,13 +18,17 @@ import (
12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 18 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" 19 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 20 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
15 - "time"  
16 ) 21 )
17 22
18 // 生产记录服务 23 // 生产记录服务
19 type ProductRecordService struct { 24 type ProductRecordService struct {
20 } 25 }
21 26
  27 +func NewProductRecordService(options map[string]interface{}) *ProductRecordService {
  28 + newProductRecordService := &ProductRecordService{}
  29 + return newProductRecordService
  30 +}
  31 +
22 // 生产记录审核 32 // 生产记录审核
23 func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *command.ApproveProductRecordCommand) (interface{}, error) { 33 func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *command.ApproveProductRecordCommand) (interface{}, error) {
24 if err := cmd.ValidateCommand(); err != nil { 34 if err := cmd.ValidateCommand(); err != nil {
@@ -35,7 +45,7 @@ func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *comm @@ -35,7 +45,7 @@ func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *comm
35 transactionContext.RollbackTransaction() 45 transactionContext.RollbackTransaction()
36 }() 46 }()
37 47
38 - svr, err := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext)) 48 + svr, _ := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext))
39 if _, err = svr.Approve(cmd.ProductRecordId, cmd.ApproveUserId, cmd.WeighAfter, time.Now()); err != nil { 49 if _, err = svr.Approve(cmd.ProductRecordId, cmd.ApproveUserId, cmd.WeighAfter, time.Now()); err != nil {
40 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 50 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
41 } 51 }
@@ -46,9 +56,9 @@ func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *comm @@ -46,9 +56,9 @@ func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *comm
46 return struct{}{}, nil 56 return struct{}{}, nil
47 } 57 }
48 58
49 -// 创建生产记录服务  
50 -func (productRecordService *ProductRecordService) CreateProductRecord(createProductRecordCommand *command.CreateProductRecordCommand) (interface{}, error) {  
51 - if err := createProductRecordCommand.ValidateCommand(); err != nil { 59 +// 创建生产记录服务,二级品
  60 +func (productRecordService *ProductRecordService) CreateProductRecord(operateInfo *domain.OperateInfo, param *command.CreateProductRecordCommand) (interface{}, error) {
  61 + if err := param.ValidateCommand(); err != nil {
52 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 62 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
53 } 63 }
54 transactionContext, err := factory.CreateTransactionContext(nil) 64 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -61,25 +71,100 @@ func (productRecordService *ProductRecordService) CreateProductRecord(createProd @@ -61,25 +71,100 @@ func (productRecordService *ProductRecordService) CreateProductRecord(createProd
61 defer func() { 71 defer func() {
62 transactionContext.RollbackTransaction() 72 transactionContext.RollbackTransaction()
63 }() 73 }()
64 - newProductRecord := &domain.ProductRecord{  
65 - ProductRecordId: createProductRecordCommand.ProductRecordId, 74 +
  75 + //日期
  76 + dataTime, err := time.ParseInLocation("2006-01-02", param.CreatedDate, time.Local)
  77 + if err != nil {
  78 + return nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
66 } 79 }
67 - var productRecordRepository domain.ProductRecordRepository  
68 - if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ 80 + //生产记录存储
  81 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
69 "transactionContext": transactionContext, 82 "transactionContext": transactionContext,
70 - }); err != nil {  
71 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
72 - } else {  
73 - productRecordRepository = value 83 + })
  84 +
  85 + //生产计划
  86 + productPlanRepo, _ := factory.CreateProductPlanRepository(map[string]interface{}{
  87 + "transactionContext": transactionContext,
  88 + })
  89 + //生产计划数据
  90 + productPlanData, err := productPlanRepo.FindOne(map[string]interface{}{
  91 + "product_plan_id": param.ProductPlanId,
  92 + "company_id": operateInfo.CompanyId,
  93 + })
  94 + if err != nil {
  95 + return nil, application.ThrowError(application.ARG_ERROR, "生产计划id错误,"+err.Error())
  96 + }
  97 + //用户数据
  98 + var user *domain.User
  99 + userService := domainService.NewUserService()
  100 + user, err = userService.User(operateInfo.UserId)
  101 + if err != nil {
  102 + return nil, application.ThrowError(application.ARG_ERROR, "获取用户错误,"+err.Error())
74 } 103 }
75 - if productRecord, err := productRecordRepository.Save(newProductRecord); err != nil { 104 + var org *domain.Org
  105 + org, err = userService.Organization(operateInfo.OrgId)
  106 + if err != nil {
76 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 107 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
77 - } else {  
78 - if err := transactionContext.CommitTransaction(); err != nil {  
79 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 108 + }
  109 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  110 + "transactionContext": transactionContext,
  111 + })
  112 + workshop, err := workshopRepo.FindOne(map[string]interface{}{"workshopId": param.WorkshopId})
  113 + if err != nil {
  114 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间数据失败"+err.Error())
  115 + }
  116 + workstation, err := workshop.FindWorkStation(param.WorkshopId, param.LineId, param.SectionId)
  117 + if err != nil {
  118 + return nil, application.ThrowError(application.ARG_ERROR, "获取车间工段数据失败"+err.Error())
  119 + }
  120 + productRecordIds := []int{}
  121 + for _, workerId := range param.WorkerId {
  122 + workerData, err := userService.User(workerId)
  123 + if err != nil {
  124 + return nil, application.ThrowError(application.ARG_ERROR, "获取员工数据错误,"+err.Error())
80 } 125 }
81 - return productRecord, nil 126 + productRecordData := &domain.ProductRecord{
  127 + CompanyId: operateInfo.CompanyId,
  128 + OrgId: operateInfo.OrgId,
  129 + ProductRecordType: domain.RecordTypeSecondLevelWeigh,
  130 + ProductWorker: workerData,
  131 + WorkStation: workstation,
  132 + CreatedAt: dataTime,
  133 + UpdatedAt: time.Now(),
  134 + ProductRecordInfo: &domain.ProductRecordInfo{
  135 + ProductDate: productPlanData.ProductDate.Local().Format("2006-01-02"),
  136 + Original: param.Weigh,
  137 + Weigh: utils.Round(param.Weigh, 1),
  138 + WeighBefore: utils.Round(param.Weigh, 1),
  139 + UnitConversionId: 0,
  140 + ApproveStatus: domain.ProductRecordNotApprove,
  141 + ProductPlanId: productPlanData.ProductPlanId,
  142 + BatchNumber: productPlanData.BatchNumber,
  143 + PlanProductName: productPlanData.PlanProductName,
  144 + ProductGroupId: 0,
  145 + WorkOn: productPlanData.WorkOn,
  146 + },
  147 + Ext: domain.NewExt(org.OrgName),
  148 + }
  149 + //保存并审核
  150 + if param.SaveAndApprove {
  151 + productRecordData.Approve(user, param.Weigh, time.Now(), domain.ProductRecordApproved)
  152 + }
  153 + _, err = productRecordRepo.Save(productRecordData)
  154 + if err != nil {
  155 + return nil, application.ThrowError(application.ARG_ERROR, "保存生产记录"+err.Error())
  156 + }
  157 + productRecordIds = append(productRecordIds, productRecordData.ProductRecordId)
  158 + if param.SaveAndApprove {
  159 + _ = domainService.SendProductRecordStaticsJob(productRecordData)
  160 + }
  161 + }
  162 + if err := transactionContext.CommitTransaction(); err != nil {
  163 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
82 } 164 }
  165 + return map[string]interface{}{
  166 + "productRecordId": productRecordIds,
  167 + }, nil
83 } 168 }
84 169
85 // 返回生产记录服务 170 // 返回生产记录服务
@@ -370,7 +455,219 @@ func (productRecordService *ProductRecordService) CancelProductRecord(cmd *comma @@ -370,7 +455,219 @@ func (productRecordService *ProductRecordService) CancelProductRecord(cmd *comma
370 return struct{}{}, nil 455 return struct{}{}, nil
371 } 456 }
372 457
373 -func NewProductRecordService(options map[string]interface{}) *ProductRecordService {  
374 - newProductRecordService := &ProductRecordService{}  
375 - return newProductRecordService 458 +// BatchAddProductRecord 从文件导入的数据,批量添加生产记录,二级品数据
  459 +func (productRecordService *ProductRecordService) BatchAddProductRecord(operate *domain.OperateInfo, param []command.BatchAddProductRecordCommand) (
  460 + failRows []interface{}, err error) {
  461 + transactionContext, err := factory.CreateTransactionContext(nil)
  462 + if err != nil {
  463 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  464 + }
  465 + if err := transactionContext.StartTransaction(); err != nil {
  466 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  467 + }
  468 + defer func() {
  469 + transactionContext.RollbackTransaction()
  470 + }()
  471 +
  472 + //获取当前操作人
  473 + userSrv := domainService.NewUserService()
  474 + operateUser, err := userSrv.User(operate.UserId)
  475 + if err != nil {
  476 + return nil, application.ThrowError(application.TRANSACTION_ERROR, "查询操作人数据失败。"+err.Error())
  477 + }
  478 + //获取当前操作人的组织
  479 + var org *domain.Org
  480 + org, err = userSrv.Organization(operate.OrgId)
  481 + if err != nil {
  482 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  483 + }
  484 +
  485 + //生产班组 数据
  486 + productGroupRepo, _ := factory.CreateProductGroupRepository(map[string]interface{}{
  487 + "transactionContext": transactionContext,
  488 + })
  489 +
  490 + //生产计划数据
  491 + productPlanRepo, _ := factory.CreateProductPlanRepository(map[string]interface{}{
  492 + "transactionContext": transactionContext,
  493 + })
  494 +
  495 + _, productGroupList, err := productGroupRepo.Find(map[string]interface{}{
  496 + "companyId": operate.CompanyId,
  497 + "orgId": operate.OrgId,
  498 + })
  499 + if err != nil {
  500 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  501 + }
  502 + //车间数据
  503 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  504 + "transactionContext": transactionContext,
  505 + })
  506 +
  507 + //获取车间列表
  508 + _, workshopList, err := workshopRepo.Find(map[string]interface{}{
  509 + "companyId": operate.CompanyId,
  510 + "orgId": operate.OrgId,
  511 + })
  512 + if err != nil {
  513 + return nil, application.ThrowError(application.BUSINESS_ERROR, "获取车间列表失败"+err.Error())
  514 + }
  515 + //车间名称+/+工人名 作为键名
  516 + workerMap := map[string][]*domain.User{}
  517 + for _, v := range productGroupList {
  518 + for _, vv := range v.GroupMembers {
  519 + k := v.WorkStation.WorkshopName + "/" + vv.UserName
  520 + isIn := false
  521 + for _, vvv := range workerMap[k] {
  522 + if vvv.UserId == vv.UserId {
  523 + isIn = true
  524 + break
  525 + }
  526 + }
  527 + if !isIn {
  528 + workerMap[k] = append(workerMap[k], vv)
  529 + }
  530 + }
  531 + }
  532 +
  533 + //车间名称+/+线别名称+/+工段名称 作为键名
  534 + workStationMap := map[string]*domain.WorkStation{}
  535 + for _, v := range workshopList {
  536 + for _, v2 := range v.ProductLines {
  537 + for _, v3 := range v2.ProductSections {
  538 + workStationName := strings.Join([]string{
  539 + v.WorkshopName, v2.LineName, v3.SectionName,
  540 + }, "/")
  541 + workStationMap[workStationName] = domain.NewWorkStation(v, v2, v3)
  542 + }
  543 + }
  544 + }
  545 +
  546 + productRecordList := []*domain.ProductRecord{}
  547 + nowTime := time.Now()
  548 + for i := range param {
  549 + //检查字段
  550 + err = param[i].ValidField()
  551 + if err != nil {
  552 + param[i].FailReason = err.Error()
  553 + failRows = append(failRows, param[i])
  554 + continue
  555 + }
  556 + //检查日期格式
  557 + productDate, err := time.ParseInLocation("2006-01-02", param[i].CreatedDate, time.Local)
  558 + if err != nil {
  559 + param[i].FailReason = "日期格式错误,例 2006-01-02。"
  560 + failRows = append(failRows, param[i])
  561 + continue
  562 + }
  563 + //检查工位
  564 + var workStation *domain.WorkStation
  565 + workStationName := param[i].WorkshopName + "/" + param[i].LineName + "/" + param[i].SectionName
  566 + if v, ok := workStationMap[workStationName]; ok {
  567 + workStation = v
  568 + } else {
  569 + param[i].FailReason = "车间、线别、工段不存在"
  570 + failRows = append(failRows, param[i])
  571 + continue
  572 + }
  573 + // //获取生产班组
  574 + // var productGroup *domain.ProductGroup
  575 + // if v, ok := productGroupMap[param[i].ProductGroupName]; ok {
  576 + // productGroup = v
  577 + // } else {
  578 + // param[i].FailReason = "班组不存在"
  579 + // failRows = append(failRows, param[i])
  580 + // continue
  581 + // }
  582 + //检查员工姓名
  583 + var worker *domain.User
  584 + workKey := param[i].WorkshopName + "/" + param[i].WorkerName
  585 + if u, ok := workerMap[workKey]; ok {
  586 + if len(u) > 1 {
  587 + param[i].FailReason = "当前车间存在重复的用户名"
  588 + failRows = append(failRows, param[i])
  589 + continue
  590 + }
  591 + worker = u[0]
  592 + } else {
  593 + param[i].FailReason = "当前车间不存在用户" + param[i].WorkerName
  594 + failRows = append(failRows, param[i])
  595 + continue
  596 + }
  597 + //二级品重量
  598 + weigh, err := strconv.ParseFloat(param[i].Weigh, 64)
  599 + if err != nil {
  600 + param[i].FailReason = "二级品重量填写错误"
  601 + failRows = append(failRows, param[i])
  602 + continue
  603 + }
  604 + //按批次获取生产计划
  605 + productPlanData, err := productPlanRepo.FindOne(map[string]interface{}{
  606 + "batchNumber": param[i].BatchNumber,
  607 + "companyId": operate.CompanyId,
  608 + })
  609 + if err != nil {
  610 + param[i].FailReason = "批次号不存在"
  611 + failRows = append(failRows, param[i])
  612 + continue
  613 + }
  614 +
  615 + tempItem := &domain.ProductRecord{
  616 + ProductRecordId: 0,
  617 + CompanyId: operate.CompanyId,
  618 + OrgId: operate.OrgId,
  619 + ProductRecordType: domain.RecordTypeSecondLevelWeigh,
  620 + ProductWorker: worker,
  621 + WorkStation: workStation,
  622 + CreatedAt: productDate,
  623 + UpdatedAt: nowTime,
  624 + DeletedAt: time.Time{},
  625 + ProductRecordInfo: &domain.ProductRecordInfo{
  626 + ProductDate: productDate.Local().Format("2006-01-02"),
  627 + Original: weigh,
  628 + Weigh: weigh,
  629 + WeighBefore: weigh,
  630 + WeighAfter: weigh,
  631 + ApproveStatus: domain.ProductRecordAutoApproved,
  632 + ApproveAt: nowTime.Unix(),
  633 + ApproveUser: operateUser,
  634 + UnitConversionId: productPlanData.Ext.ProductPlanExt.ProductId,
  635 + ProductPlanId: productPlanData.ProductPlanId,
  636 + PlanProductName: productPlanData.PlanProductName,
  637 + BatchNumber: productPlanData.BatchNumber,
  638 + ProductGroupId: 0,
  639 + WorkOn: productPlanData.WorkOn,
  640 + },
  641 + Ext: &domain.Ext{
  642 + Operator: operateUser,
  643 + OrgName: org.OrgName,
  644 + },
  645 + PreRecord: &domain.ProductRecord{},
  646 + }
  647 + productRecordList = append(productRecordList, tempItem)
  648 + }
  649 + if len(failRows) > 0 {
  650 + return failRows, nil
  651 + }
  652 + productRecordRepo, _ := factory.CreateProductRecordRepository(map[string]interface{}{
  653 + "transactionContext": transactionContext,
  654 + })
  655 + for i := range productRecordList {
  656 + _, err := productRecordRepo.Save(productRecordList[i])
  657 + if err != nil {
  658 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  659 + }
  660 + }
  661 + if err := transactionContext.CommitTransaction(); err != nil {
  662 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  663 + }
  664 + for i := range productRecordList {
  665 + err = domainService.SendProductRecordStaticsJob(productRecordList[i])
  666 + if err != nil {
  667 + e := fmt.Sprintf("【发送产量统计任务失败】 ProductRecordId=%d, %s", productRecordList[i].ProductRecordId, err.Error())
  668 + log.Logger.Error(e)
  669 + return failRows, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  670 + }
  671 + }
  672 + return failRows, nil
376 } 673 }
  1 +package command
  2 +
  3 +import "errors"
  4 +
  5 +type BatchAddProductTroubleCommand struct {
  6 + RecordDate string `json:"recordDate"` //事故发生的日期 2006-01-02
  7 + WorkshopName string `json:"workshopId"` //车间
  8 + LineName string `json:"lineName"` //生产线
  9 + SectionName string `json:"sectionId" valid:"Required"` //工段
  10 + WorkerName string `json:"workerId"` //员工名字
  11 + AmountLoss string `json:"amountLoss"` // 损失的金额
  12 + TypesName string `json:"types"` // 事故类型 1 安全事故 ,2 质量事故, 3 金属事故 ,4 非金属事故
  13 + FailReason string `json:"failReason"` // 数据检查失败的原因
  14 +}
  15 +
  16 +func (c *BatchAddProductTroubleCommand) ValidField() error {
  17 + if len(c.RecordDate) == 0 {
  18 + return errors.New("日期 必填")
  19 + }
  20 + if len(c.WorkshopName) == 0 {
  21 + return errors.New("车间 必填")
  22 + }
  23 + if len(c.LineName) == 0 {
  24 + return errors.New("生产线 必填")
  25 + }
  26 + if len(c.SectionName) == 0 {
  27 + return errors.New("工段 必填")
  28 + }
  29 + if len(c.WorkerName) == 0 {
  30 + return errors.New("员工名字 必填")
  31 + }
  32 + if len(c.AmountLoss) == 0 {
  33 + return errors.New("损失金额 必填")
  34 + }
  35 + if len(c.TypesName) == 0 {
  36 + return errors.New("事故类型 必填")
  37 + }
  38 + return nil
  39 +}
  1 +package command
  2 +
  3 +//创建事故记录
  4 +type CreateProductTroubleCommand struct {
  5 + Id int `json:"id"` //id
  6 + WorkshopId int `json:"workshopId" valid:"Required"` //车间id
  7 + LineId int `json:"lineId" valid:"Required"` //生产线ID
  8 + SectionId int `json:"sectionId" valid:"Required"` //工段ID
  9 + WorkerId []int `json:"workerId"` //员工id //多选
  10 + Remark string `json:"remark"` //备注
  11 + AmountLoss float64 `json:"amountLoss"` // 损失的金额
  12 + Types string `json:"types"` // 事故类型 1 安全事故 ,2 质量事故, 3 金属事故 ,4 非金属事故
  13 + RecordDate string `json:"recordDate"` // 事故发生的日期
  14 + SaveAndApprove bool `json:"saveAndApprove"` //保存并审核
  15 +}
  1 +package command
  2 +
  3 +//保存事故记录
  4 +type SaveProductTroubleCommand struct {
  5 + Id int `json:"id"` //id
  6 + WorkshopId int `json:"workshopId" valid:"Required"` //车间id
  7 + LineId int `json:"lineId" valid:"Required"` //生产线ID
  8 + SectionId int `json:"sectionId" valid:"Required"` //工段ID
  9 + WorkerId int `json:"workerId"` //员工id
  10 + Remark string `json:"remark"` //备注
  11 + AmountLoss float64 `json:"amountLoss"` // 损失的金额
  12 + Types string `json:"types"` // 事故类型 1 安全事故 ,2 质量事故, 3 金属事故 ,4 非金属事故
  13 + RecordDate string `json:"recordDate"` // 事故发生的日期
  14 + SaveAndApprove bool `json:"saveAndApprove"` //保存并审核
  15 +}
  1 +package dto
  2 +
  3 +type ProductTroubleInfo struct {
  4 + Id int `json:"id"` //id
  5 + WorkshopId int `json:"workshopId"` //车间id
  6 + WorkshopName string `json:"workshopName"` //
  7 + LineId int `json:"lineId"` //生产线ID
  8 + LineName string `json:"lineName"` //
  9 + SectionId int `json:"sectionId"` //工段ID
  10 + SectionName string `json:"sectionName"` //
  11 + WorkerId int `json:"workerId"` //员工id
  12 + WorkerName string `json:"workerName"` //员工名称
  13 + Remark string `json:"remark"` //备注
  14 + ProductDate string `json:"productDate"` //日期
  15 + AmountLoss float64 `json:"amountLoss"` //损失的金额
  16 + Types string `json:"types"` //事故类型
  17 +}
  1 +package dto
  2 +
  3 +type ProductTroubleList struct {
  4 + Id int `json:"id"` //id
  5 + WorkshopId int `json:"workshopId"` //车间id
  6 + WorkshopName string `json:"workshopName"` //
  7 + LineId int `json:"lineId"` //生产线ID
  8 + LineName string `json:"lineName"` //
  9 + SectionId int `json:"sectionId"` //工段ID
  10 + SectionName string `json:"sectionName"` //
  11 + Remark string `json:"remark"` //备注
  12 + ProductDate string `json:"productDate"` //日期
  13 + AmountLoss float64 `json:"amountLoss"` //损失的金额
  14 + Types string `json:"types"` //事故类型
  15 + WorkerId int `json:"workerId"` //员工
  16 + WorkerName string `json:"workerName"` //员工名称
  17 + ApproveStatus int `json:"approveStatus"` //审核状态
  18 + ApproveStatusName string `json:"approveStatusName"` //审核状态
  19 +}
  1 +package dto
  2 +
  3 +type RewardSummaryList struct {
  4 + Id int `json:"id"`
  5 + RecordDate string `json:"recordDate"` //日期
  6 + WorkshopName string `json:"workshopName"` //车间名称
  7 + LineName string `json:"lineName"` //线别名称
  8 + SectionName string `json:"sectionName"` //工段
  9 + WorkerName string `json:"workerName"` //员工名字
  10 + Yield string `json:"yield"` //产效
  11 + UpToStandard string `json:"upToStandard"` //合格率
  12 + Accident1 string `json:"accident1"` //质量事故
  13 + Accident2 string `json:"accident2"` //安全事故
  14 + Accident3 string `json:"accident3"` //异物事故
  15 + SummaryResult string `json:"summaryResult"` //奖惩结果
  16 + ResultDesc string `json:"resultDesc"` //产效结果
  17 +}
  1 +package query
  2 +
  3 +type GetProductTroubleQuery struct {
  4 + // 生产记录ID
  5 + Id int `json:"id" valid:"Required"`
  6 +}
  1 +package query
  2 +
  3 +type ListProductTrouble struct {
  4 + // 当前公司
  5 + CompanyId int `cname:"当前公司" json:"companyId"`
  6 + // 当前登录的组织
  7 + OrgId int `cname:"当前登录的组织" json:"orgId"`
  8 + // 页码
  9 + PageNumber int `cname:"页码" json:"pageNumber"`
  10 + // 页数
  11 + PageSize int `cname:"页数" json:"pageSize"`
  12 + // 车间名称
  13 + WorkshopName string `cname:"车间名称" json:"workshopName"`
  14 + //员工名称
  15 + WorkerName string `cname:"员工名称" json:"workerName"`
  16 +}
  1 +package query
  2 +
  3 +type ListRewardSummaryQuery struct {
  4 + // 当前公司
  5 + CompanyId int `cname:"当前公司" json:"companyId"`
  6 + // 当前登录的组织
  7 + OrgId int `cname:"当前登录的组织" json:"orgId"`
  8 + // 页码
  9 + PageNumber int `cname:"页码" json:"pageNumber"`
  10 + // 页数
  11 + PageSize int `cname:"页数" json:"pageSize"`
  12 + // 车间名称
  13 + WorkshopName string `cname:"车间名称" json:"workshopName"`
  14 +
  15 + LineName string `cname:"线别名称" json:"lineName"`
  16 +
  17 + BeginDate string `cname:"开始的日期" json:"beginDate"`
  18 +
  19 + EndDate string `cname:"结束的日期" json:"endDate"`
  20 +}
  1 +package service
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "github.com/linmadan/egglib-go/core/application"
  7 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
  11 +)
  12 +
  13 +//功过看板 展示(员工)
  14 +
  15 +// RewardSummaryPublicNoticeDay 功过看板 日榜
  16 +func (srv ProductTroubleService) RewardSummaryPublicNoticeDay(operateInfo *domain.OperateInfo) (map[string]interface{}, error) {
  17 + transactionContext, err := factory.CreateTransactionContext(nil)
  18 + if err != nil {
  19 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  20 + }
  21 + if err := transactionContext.StartTransaction(); err != nil {
  22 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  23 + }
  24 + defer func() {
  25 + transactionContext.RollbackTransaction()
  26 + }()
  27 + rewardSumaryDao, _ := dao.NewRewardSumaryDao(transactionContext.(*pgTransaction.TransactionContext))
  28 + nowTime := time.Now().Format("2006-01-02")
  29 + sumaryData, err := rewardSumaryDao.SeachRewardSummaryDay(operateInfo.CompanyId, operateInfo.OrgId, nowTime)
  30 + if err != nil {
  31 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  32 + }
  33 + if err := transactionContext.CommitTransaction(); err != nil {
  34 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  35 + }
  36 + result := map[string]interface{}{
  37 + "list": sumaryData,
  38 + "recordDay": nowTime,
  39 + }
  40 +
  41 + return result, nil
  42 +}
  43 +
  44 +// RewardSummaryPublicNoticeYield 功过看板 产效
  45 +func (srv ProductTroubleService) RewardSummaryPublicNoticeYield(operateInfo *domain.OperateInfo) (map[string]interface{}, error) {
  46 +
  47 + transactionContext, err := factory.CreateTransactionContext(nil)
  48 + if err != nil {
  49 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  50 + }
  51 + if err := transactionContext.StartTransaction(); err != nil {
  52 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  53 + }
  54 + defer func() {
  55 + transactionContext.RollbackTransaction()
  56 + }()
  57 + rewardSumaryDao, _ := dao.NewRewardSumaryDao(transactionContext.(*pgTransaction.TransactionContext))
  58 + nowTime := time.Now().Format("2006-01-02")
  59 + sumaryData, err := rewardSumaryDao.SeachRewardSummaryYield(operateInfo.CompanyId, operateInfo.OrgId, nowTime)
  60 + if err != nil {
  61 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  62 + }
  63 + if err := transactionContext.CommitTransaction(); err != nil {
  64 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  65 + }
  66 + result := map[string]interface{}{
  67 + "list": sumaryData,
  68 + }
  69 +
  70 + return result, nil
  71 +
  72 +}
  73 +
  74 +// RewardSummaryPublicNoticeUpToStandard 功过看板 合格率
  75 +func (srv ProductTroubleService) RewardSummaryPublicNoticeUpToStandard(operateInfo *domain.OperateInfo) (map[string]interface{}, error) {
  76 +
  77 + transactionContext, err := factory.CreateTransactionContext(nil)
  78 + if err != nil {
  79 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  80 + }
  81 + if err := transactionContext.StartTransaction(); err != nil {
  82 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  83 + }
  84 + defer func() {
  85 + transactionContext.RollbackTransaction()
  86 + }()
  87 + rewardSumaryDao, _ := dao.NewRewardSumaryDao(transactionContext.(*pgTransaction.TransactionContext))
  88 + nowTime := time.Now().Format("2006-01-02")
  89 + sumaryData, err := rewardSumaryDao.SeachRewardUpToStandard(operateInfo.CompanyId, operateInfo.OrgId, nowTime)
  90 + if err != nil {
  91 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  92 + }
  93 + if err := transactionContext.CommitTransaction(); err != nil {
  94 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  95 + }
  96 + result := map[string]interface{}{
  97 + "list": sumaryData,
  98 + }
  99 +
  100 + return result, nil
  101 +}
  102 +
  103 +// RewardSummaryPublicNoticeDay 功过看板 异常
  104 +func (srv ProductTroubleService) RewardSummaryPublicNoticeAccident(operateInfo *domain.OperateInfo) (map[string]interface{}, error) {
  105 +
  106 + transactionContext, err := factory.CreateTransactionContext(nil)
  107 + if err != nil {
  108 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  109 + }
  110 + if err := transactionContext.StartTransaction(); err != nil {
  111 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  112 + }
  113 + defer func() {
  114 + transactionContext.RollbackTransaction()
  115 + }()
  116 + rewardSumaryDao, _ := dao.NewRewardSumaryDao(transactionContext.(*pgTransaction.TransactionContext))
  117 + nowTime := time.Now().Format("2006-01-02")
  118 + sumaryData, err := rewardSumaryDao.SeachRewardAccident(operateInfo.CompanyId, operateInfo.OrgId, nowTime)
  119 + if err != nil {
  120 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  121 + }
  122 + if err := transactionContext.CommitTransaction(); err != nil {
  123 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  124 + }
  125 + result := map[string]interface{}{
  126 + "list": sumaryData,
  127 + }
  128 + return result, nil
  129 +}
  130 +
  131 +// RewardSummaryPublicNoticeDay 功过看板 月榜
  132 +func (srv ProductTroubleService) RewardSummaryPublicNoticeMonth(operateInfo *domain.OperateInfo) (map[string]interface{}, error) {
  133 + transactionContext, err := factory.CreateTransactionContext(nil)
  134 + if err != nil {
  135 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  136 + }
  137 + if err := transactionContext.StartTransaction(); err != nil {
  138 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  139 + }
  140 + defer func() {
  141 + transactionContext.RollbackTransaction()
  142 + }()
  143 + rewardSumaryDao, _ := dao.NewRewardSumaryDao(transactionContext.(*pgTransaction.TransactionContext))
  144 + nowTime := time.Now().Format("2006-01")
  145 + sumaryData, err := rewardSumaryDao.SeachRewardSummaryMonth(operateInfo.CompanyId, operateInfo.OrgId, nowTime)
  146 + if err != nil {
  147 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  148 + }
  149 + if err := transactionContext.CommitTransaction(); err != nil {
  150 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  151 + }
  152 + result := map[string]interface{}{
  153 + "list": sumaryData,
  154 + }
  155 + return result, nil
  156 +}
  1 +package service
  2 +
  3 +import (
  4 + "fmt"
  5 + "strconv"
  6 + "strings"
  7 + "time"
  8 +
  9 + "github.com/linmadan/egglib-go/core/application"
  10 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  12 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/command"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/dto"
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/query"
  15 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  16 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  17 +)
  18 +
  19 +// 事故管理
  20 +type ProductTroubleService struct{}
  21 +
  22 +func NewProductTroubleService(options map[string]interface{}) *ProductTroubleService {
  23 + newService := &ProductTroubleService{}
  24 + return newService
  25 +}
  26 +
  27 +func (srv ProductTroubleService) SaveProductTrouble(operateInfo *domain.OperateInfo, param *command.SaveProductTroubleCommand) (map[string]interface{}, error) {
  28 + transactionContext, err := factory.CreateTransactionContext(nil)
  29 + if err != nil {
  30 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  31 + }
  32 + if err := transactionContext.StartTransaction(); err != nil {
  33 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  34 + }
  35 + defer func() {
  36 + transactionContext.RollbackTransaction()
  37 + }()
  38 +
  39 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  40 + "transactionContext": transactionContext,
  41 + })
  42 + workShopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  43 + "transactionContext": transactionContext,
  44 + })
  45 + //获取车间数据
  46 + workShopData, err := workShopRepo.FindOne(map[string]interface{}{
  47 + "workshopId": param.WorkshopId,
  48 + })
  49 + if err != nil {
  50 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据不能存在"+err.Error())
  51 + }
  52 + if workShopData.CompanyId != operateInfo.CompanyId {
  53 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据填写错误")
  54 + }
  55 + workStation, err := workShopData.FindWorkStation(param.WorkshopId, param.LineId, param.SectionId)
  56 + if err != nil {
  57 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  58 + }
  59 +
  60 + recordDate, err := time.ParseInLocation("2006-01-02", param.RecordDate, time.Local)
  61 + if err != nil {
  62 + return nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  63 + }
  64 + var workerUser *domain.User
  65 + userService := domainService.NewUserService()
  66 + workerUser, err = userService.User(param.WorkerId)
  67 + if err != nil {
  68 + return nil, application.ThrowError(application.ARG_ERROR, "获取员工信息失败,"+err.Error())
  69 + }
  70 + var troubleData *domain.ProductTrouble
  71 + if param.Id > 0 {
  72 + troubleData, err = productTroubleRepo.FindOne(map[string]interface{}{
  73 + "id": param.Id,
  74 + })
  75 + if err != nil {
  76 + return nil, application.ThrowError(application.ARG_ERROR, "事故数据填写错误")
  77 + }
  78 + } else {
  79 + troubleData = &domain.ProductTrouble{
  80 + CompanyId: operateInfo.CompanyId,
  81 + OrgId: operateInfo.OrgId,
  82 + CreatedAt: time.Now(),
  83 + ApproveStatus: domain.TroubleWaitApprove,
  84 + }
  85 + }
  86 +
  87 + troubleData.AmountLoss = param.AmountLoss
  88 + troubleData.ProductWorker = *workerUser
  89 + troubleData.RecordDate = recordDate
  90 + troubleData.Remark = param.Remark
  91 + troubleData.UpdatedAt = time.Now()
  92 + troubleData.WorkStation = *workStation
  93 + err = troubleData.SetTypes(param.Types)
  94 + if err != nil {
  95 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  96 + }
  97 + if param.SaveAndApprove {
  98 + var approveUser *domain.User
  99 + userService := domainService.NewUserService()
  100 + approveUser, err = userService.User(operateInfo.UserId)
  101 + if err != nil {
  102 + return nil, application.ThrowError(application.ARG_ERROR, "获取审核人信息失败,"+err.Error())
  103 + }
  104 + err = troubleData.Approve(approveUser)
  105 + if err != nil {
  106 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  107 + }
  108 + }
  109 + _, err = productTroubleRepo.Save(troubleData)
  110 + if err != nil {
  111 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  112 + }
  113 + if param.SaveAndApprove {
  114 + summaryServe, _ := domainService.NewPGRewardSummaryStaticService(transactionContext.(*pgTransaction.TransactionContext))
  115 + err = summaryServe.CreateRewardSummaryByProductTrouble(troubleData)
  116 + if err != nil {
  117 + return nil, application.ThrowError(application.ARG_ERROR, "计算功过奖惩明细失败,"+err.Error())
  118 + }
  119 + }
  120 + if err := transactionContext.CommitTransaction(); err != nil {
  121 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  122 + }
  123 + return map[string]interface{}{
  124 + "id": troubleData.Id,
  125 + }, nil
  126 +}
  127 +
  128 +func (srv ProductTroubleService) GetProductTrouble(id int) (*dto.ProductTroubleInfo, error) {
  129 + transactionContext, err := factory.CreateTransactionContext(nil)
  130 + if err != nil {
  131 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  132 + }
  133 + if err := transactionContext.StartTransaction(); err != nil {
  134 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  135 + }
  136 + defer func() {
  137 + transactionContext.RollbackTransaction()
  138 + }()
  139 +
  140 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  141 + "transactionContext": transactionContext,
  142 + })
  143 + troubleData, err := productTroubleRepo.FindOne(map[string]interface{}{
  144 + "id": id,
  145 + })
  146 + if err != nil {
  147 + return nil, application.ThrowError(application.ARG_ERROR, "事故数据不存在,"+err.Error())
  148 + }
  149 + if err := transactionContext.CommitTransaction(); err != nil {
  150 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  151 + }
  152 +
  153 + result := dto.ProductTroubleInfo{
  154 + Id: troubleData.Id,
  155 + WorkshopId: troubleData.WorkStation.WorkshopId,
  156 + WorkshopName: troubleData.WorkStation.WorkshopName,
  157 + LineId: troubleData.WorkStation.LineId,
  158 + LineName: troubleData.WorkStation.LineName,
  159 + SectionId: troubleData.WorkStation.SectionId,
  160 + SectionName: troubleData.WorkStation.SectionName,
  161 + Remark: troubleData.Remark,
  162 + ProductDate: troubleData.RecordDate.Format("2006-01-02"),
  163 + AmountLoss: troubleData.AmountLoss,
  164 + Types: string(troubleData.Types),
  165 + WorkerId: troubleData.ProductWorker.UserId,
  166 + WorkerName: troubleData.ProductWorker.UserName,
  167 + }
  168 + return &result, nil
  169 +}
  170 +
  171 +func (srv ProductTroubleService) DeleteProductTrouble(id int64) error {
  172 + transactionContext, err := factory.CreateTransactionContext(nil)
  173 + if err != nil {
  174 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  175 + }
  176 + if err := transactionContext.StartTransaction(); err != nil {
  177 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  178 + }
  179 + defer func() {
  180 + transactionContext.RollbackTransaction()
  181 + }()
  182 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  183 + "transactionContext": transactionContext,
  184 + })
  185 + troubleData, err := productTroubleRepo.FindOne(map[string]interface{}{
  186 + "id": id,
  187 + })
  188 + if err != nil {
  189 + return application.ThrowError(application.ARG_ERROR, "事故数据不存在,"+err.Error())
  190 + }
  191 + _, err = productTroubleRepo.Remove(troubleData)
  192 + if err != nil {
  193 + return application.ThrowError(application.ARG_ERROR, err.Error())
  194 + }
  195 + if err := transactionContext.CommitTransaction(); err != nil {
  196 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  197 + }
  198 + return nil
  199 +}
  200 +
  201 +// 审核事故
  202 +func (srv ProductTroubleService) ApproveProductTrouble(operateInfo *domain.OperateInfo, id int64) error {
  203 + transactionContext, err := factory.CreateTransactionContext(nil)
  204 + if err != nil {
  205 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  206 + }
  207 + if err := transactionContext.StartTransaction(); err != nil {
  208 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  209 + }
  210 + defer func() {
  211 + transactionContext.RollbackTransaction()
  212 + }()
  213 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  214 + "transactionContext": transactionContext,
  215 + })
  216 + troubleData, err := productTroubleRepo.FindOne(map[string]interface{}{
  217 + "id": id,
  218 + })
  219 + if err != nil {
  220 + return application.ThrowError(application.ARG_ERROR, "事故数据不存在,"+err.Error())
  221 + }
  222 + var approveUser *domain.User
  223 + userService := domainService.NewUserService()
  224 + approveUser, err = userService.User(operateInfo.UserId)
  225 + if err != nil {
  226 + return application.ThrowError(application.ARG_ERROR, "获取审核人信息失败,"+err.Error())
  227 + }
  228 + err = troubleData.Approve(approveUser)
  229 + if err != nil {
  230 + return application.ThrowError(application.ARG_ERROR, err.Error())
  231 + }
  232 +
  233 + troubleData.UpdatedAt = time.Now()
  234 + _, err = productTroubleRepo.Save(troubleData)
  235 + if err != nil {
  236 + return application.ThrowError(application.ARG_ERROR, err.Error())
  237 + }
  238 +
  239 + //汇总奖惩明细
  240 + summaryServe, _ := domainService.NewPGRewardSummaryStaticService(transactionContext.(*pgTransaction.TransactionContext))
  241 + err = summaryServe.CreateRewardSummaryByProductTrouble(troubleData)
  242 + if err != nil {
  243 + return application.ThrowError(application.ARG_ERROR, "计算功过奖惩明细失败,"+err.Error())
  244 + }
  245 + if err := transactionContext.CommitTransaction(); err != nil {
  246 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  247 + }
  248 + return nil
  249 +}
  250 +
  251 +// ListProductTrouble 事故管理列表
  252 +func (srv ProductTroubleService) ListProductTrouble(param *query.ListProductTrouble) (int64, []dto.ProductTroubleList, error) {
  253 + transactionContext, err := factory.CreateTransactionContext(nil)
  254 + if err != nil {
  255 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  256 + }
  257 + if err := transactionContext.StartTransaction(); err != nil {
  258 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  259 + }
  260 + defer func() {
  261 + transactionContext.RollbackTransaction()
  262 + }()
  263 +
  264 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  265 + "transactionContext": transactionContext,
  266 + })
  267 + limit := param.PageSize
  268 + offset := param.PageSize * (param.PageNumber - 1)
  269 + condition := map[string]interface{}{
  270 + "limit": limit,
  271 + "offset": offset,
  272 + "companyId": param.CompanyId,
  273 + "orgId": param.OrgId,
  274 + }
  275 +
  276 + if len(param.WorkerName) > 0 {
  277 + condition["productWorkerName"] = param.WorkerName
  278 + }
  279 +
  280 + if len(param.WorkshopName) > 0 {
  281 + condition["workshopName"] = param.WorkshopName
  282 + }
  283 + cnt, troubleDataList, err := productTroubleRepo.Find(condition)
  284 + if err != nil {
  285 + return 0, nil, application.ThrowError(application.ARG_ERROR, "事故数据不存在,"+err.Error())
  286 + }
  287 + if err := transactionContext.CommitTransaction(); err != nil {
  288 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  289 + }
  290 +
  291 + result := []dto.ProductTroubleList{}
  292 + var item dto.ProductTroubleList
  293 + for _, v := range troubleDataList {
  294 + item = dto.ProductTroubleList{
  295 + Id: v.Id,
  296 + WorkshopId: v.WorkStation.WorkshopId,
  297 + WorkshopName: v.WorkStation.WorkshopName,
  298 + LineId: v.WorkStation.LineId,
  299 + LineName: v.WorkStation.LineName,
  300 + SectionId: v.WorkStation.SectionId,
  301 + SectionName: v.WorkStation.SectionName,
  302 + Remark: v.Remark,
  303 + ProductDate: v.RecordDate.Local().Format("2006-01-02"),
  304 + AmountLoss: v.AmountLoss,
  305 + Types: v.GetTypesName(),
  306 + WorkerId: v.ProductWorker.UserId,
  307 + WorkerName: v.ProductWorker.UserName,
  308 + ApproveStatus: int(v.ApproveStatus),
  309 + ApproveStatusName: v.GetApproveStatusName(),
  310 + }
  311 + result = append(result, item)
  312 + }
  313 +
  314 + return cnt, result, nil
  315 +}
  316 +
  317 +// 批量添加事故数据
  318 +func (srv ProductTroubleService) BatchAddProductTrouble(operateInfo *domain.OperateInfo, param []command.BatchAddProductTroubleCommand) (failRows []interface{}, err error) {
  319 + transactionContext, err := factory.CreateTransactionContext(nil)
  320 + if err != nil {
  321 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  322 + }
  323 + if err := transactionContext.StartTransaction(); err != nil {
  324 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  325 + }
  326 + defer func() {
  327 + transactionContext.RollbackTransaction()
  328 + }()
  329 +
  330 + //获取当前操作人
  331 + userSrv := domainService.NewUserService()
  332 + operateUser, err := userSrv.User(operateInfo.UserId)
  333 + if err != nil {
  334 + return nil, application.ThrowError(application.TRANSACTION_ERROR, "查询操作人数据失败。"+err.Error())
  335 + }
  336 + //车间数据
  337 + workshopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  338 + "transactionContext": transactionContext,
  339 + })
  340 +
  341 + //获取车间列表
  342 + _, workshopList, err := workshopRepo.Find(map[string]interface{}{
  343 + "companyId": operateInfo.CompanyId,
  344 + "orgId": operateInfo.OrgId,
  345 + })
  346 + if err != nil {
  347 + return nil, application.ThrowError(application.BUSINESS_ERROR, "获取车间列表失败"+err.Error())
  348 + }
  349 + //生产班组 数据
  350 + productGroupRepo, _ := factory.CreateProductGroupRepository(map[string]interface{}{
  351 + "transactionContext": transactionContext,
  352 + })
  353 + _, productGroupList, err := productGroupRepo.Find(map[string]interface{}{
  354 + "companyId": operateInfo.CompanyId,
  355 + "orgId": operateInfo.OrgId,
  356 + })
  357 + if err != nil {
  358 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  359 + }
  360 +
  361 + //车间名称+/+工人名 作为键名
  362 + workerMap := map[string][]*domain.User{}
  363 + //班组名称 作为键名
  364 + // productGroupMap := map[string]*domain.ProductGroup{}
  365 + for _, v := range productGroupList {
  366 + // productGroupMap[v.GroupName] = v
  367 + for _, vv := range v.GroupMembers {
  368 + k := v.WorkStation.WorkshopName + "/" + vv.UserName
  369 + isIn := false
  370 + for _, vvv := range workerMap[k] {
  371 + if vvv.UserId == vv.UserId {
  372 + isIn = true
  373 + break
  374 + }
  375 + }
  376 + if !isIn {
  377 + workerMap[k] = append(workerMap[k], vv)
  378 + }
  379 + }
  380 + }
  381 + //车间名称+/+线别名称+/+工段名称 作为键名
  382 + workStationMap := map[string]*domain.WorkStation{}
  383 + for _, v := range workshopList {
  384 + for _, v2 := range v.ProductLines {
  385 + for _, v3 := range v2.ProductSections {
  386 + workStationName := strings.Join([]string{
  387 + v.WorkshopName, v2.LineName, v3.SectionName,
  388 + }, "/")
  389 + workStationMap[workStationName] = domain.NewWorkStation(v, v2, v3)
  390 + }
  391 + }
  392 + }
  393 +
  394 + troubleDataList := make([]*domain.ProductTrouble, 0, len(param))
  395 + nowTime := time.Now()
  396 + for i := range param {
  397 + //检查字段
  398 + err = param[i].ValidField()
  399 + if err != nil {
  400 + param[i].FailReason = err.Error()
  401 + failRows = append(failRows, param[i])
  402 + continue
  403 + }
  404 + //检查日期格式
  405 + recordDate, err := time.ParseInLocation("2006-01-02", param[i].RecordDate, time.Local)
  406 + if err != nil {
  407 + param[i].FailReason = "日期格式错误,例 2006-01-02。"
  408 + failRows = append(failRows, param[i])
  409 + continue
  410 + }
  411 + //检查工位
  412 + var workStation *domain.WorkStation
  413 + workStationName := param[i].WorkshopName + "/" + param[i].LineName + "/" + param[i].SectionName
  414 + if v, ok := workStationMap[workStationName]; ok {
  415 + workStation = v
  416 + } else {
  417 + param[i].FailReason = "车间、线别、工段不存在"
  418 + failRows = append(failRows, param[i])
  419 + continue
  420 + }
  421 + //检查员工姓名
  422 + var worker *domain.User
  423 + workKey := param[i].WorkshopName + "/" + param[i].WorkerName
  424 + if u, ok := workerMap[workKey]; ok {
  425 + if len(u) > 1 {
  426 + param[i].FailReason = "当前车间存在重复的用户名"
  427 + failRows = append(failRows, param[i])
  428 + continue
  429 + }
  430 + worker = u[0]
  431 + } else {
  432 + param[i].FailReason = "当前车间不存在用户" + param[i].WorkerName
  433 + failRows = append(failRows, param[i])
  434 + continue
  435 + }
  436 + //损失金额
  437 + amountLoss, err := strconv.ParseFloat(param[i].AmountLoss, 64)
  438 + if err != nil {
  439 + param[i].FailReason = "损失金额填写错误"
  440 + failRows = append(failRows, param[i])
  441 + continue
  442 + }
  443 + item := &domain.ProductTrouble{
  444 + Id: 0,
  445 + CompanyId: operateInfo.CompanyId,
  446 + OrgId: operateInfo.OrgId,
  447 + WorkStation: *workStation,
  448 + ProductWorker: *worker,
  449 + AmountLoss: amountLoss,
  450 + Types: "",
  451 + RecordDate: recordDate,
  452 + Remark: "",
  453 + ApproveStatus: domain.TroubleIsApprove,
  454 + ApproveAt: &nowTime,
  455 + ApproveUser: operateUser,
  456 + CreatedAt: nowTime,
  457 + UpdatedAt: nowTime,
  458 + DeletedAt: nil,
  459 + }
  460 + err = item.SetTypes(param[i].TypesName)
  461 + if err != nil {
  462 + param[i].FailReason = "事故类型填写错误"
  463 + failRows = append(failRows, param[i])
  464 + continue
  465 + }
  466 + troubleDataList = append(troubleDataList, item)
  467 + }
  468 +
  469 + if len(failRows) > 0 {
  470 + return failRows, nil
  471 + }
  472 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  473 + "transactionContext": transactionContext,
  474 + })
  475 + summaryServe, _ := domainService.NewPGRewardSummaryStaticService(transactionContext.(*pgTransaction.TransactionContext))
  476 + for i := range troubleDataList {
  477 + //添加事故数据
  478 + _, err = productTroubleRepo.Save(troubleDataList[i])
  479 + if err != nil {
  480 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  481 + }
  482 + //汇总奖惩明细
  483 + err = summaryServe.CreateRewardSummaryByProductTrouble(troubleDataList[i])
  484 + if err != nil {
  485 + return nil, application.ThrowError(application.ARG_ERROR, "计算功过奖惩明细失败,"+err.Error())
  486 + }
  487 + }
  488 +
  489 + if err := transactionContext.CommitTransaction(); err != nil {
  490 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  491 + }
  492 + return nil, nil
  493 +}
  494 +
  495 +// 奖惩汇总数据列表
  496 +func (srv ProductTroubleService) ListRewardSummary(param *query.ListRewardSummaryQuery) (int64, []dto.RewardSummaryList, error) {
  497 +
  498 + transactionContext, err := factory.CreateTransactionContext(nil)
  499 + if err != nil {
  500 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  501 + }
  502 + if err := transactionContext.StartTransaction(); err != nil {
  503 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  504 + }
  505 + defer func() {
  506 + transactionContext.RollbackTransaction()
  507 + }()
  508 +
  509 + rewardSummaryRepo, _ := factory.CreateRewardSummaryRepository(map[string]interface{}{
  510 + "transactionContext": transactionContext,
  511 + })
  512 + limit := param.PageSize
  513 + offset := param.PageSize * (param.PageNumber - 1)
  514 + condition := map[string]interface{}{
  515 + "orgId": param.OrgId,
  516 + "companyId": param.CompanyId,
  517 + "offset": offset,
  518 + "limit": limit,
  519 + }
  520 + //搜索条件日期
  521 + if len(param.BeginDate) > 0 {
  522 + beginDate, err := time.ParseInLocation("2006-01-02", param.BeginDate, time.Local)
  523 + if err != nil {
  524 + return 0, nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  525 + } else {
  526 + condition["beginDate"] = beginDate
  527 + }
  528 +
  529 + }
  530 + //搜索条件日期
  531 + if len(param.EndDate) > 0 {
  532 + endDate, err := time.ParseInLocation("2006-01-02", param.EndDate, time.Local)
  533 + if err != nil {
  534 + return 0, nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  535 + } else {
  536 + endDate = endDate.Add((86400 - 1) * time.Second)
  537 + condition["endDate"] = endDate
  538 + }
  539 +
  540 + }
  541 + //搜索条件 车间名称
  542 + if len(param.WorkshopName) > 0 {
  543 + condition["workshopName"] = param.WorkshopName
  544 + }
  545 + //搜索条件 线别名称
  546 + if len(param.LineName) > 0 {
  547 + condition["lineName"] = param.LineName
  548 + }
  549 +
  550 + cnt, rewardSummaryList, err := rewardSummaryRepo.Find(condition)
  551 + if err != nil {
  552 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  553 + }
  554 + if err := transactionContext.CommitTransaction(); err != nil {
  555 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  556 + }
  557 +
  558 + result := []dto.RewardSummaryList{}
  559 + for _, v := range rewardSummaryList {
  560 + item := dto.RewardSummaryList{
  561 + Id: v.Id,
  562 + RecordDate: v.RecordDate.Local().Format("2006-01-02"),
  563 + WorkshopName: v.WorkStation.WorkshopName,
  564 + LineName: v.WorkStation.LineName,
  565 + SectionName: v.WorkStation.SectionName,
  566 + WorkerName: v.Worker.UserName,
  567 + Yield: fmt.Sprintf("%.2f", v.Yield),
  568 + UpToStandard: fmt.Sprintf("%.2f%%", v.UpToStandard),
  569 + Accident1: fmt.Sprintf("%d次%.2f元", v.AccidentNum1, v.AccidentAmount1),
  570 + Accident2: fmt.Sprintf("%d次%.2f元", v.AccidentNum2, v.AccidentAmount2),
  571 + Accident3: fmt.Sprintf("金属%d次,非金属%d次", v.AccidentNum3, v.AccidentNum4),
  572 + SummaryResult: fmt.Sprintf("%v", v.SummaryResult),
  573 + ResultDesc: "",
  574 + }
  575 + if v.SummaryResult == 0 {
  576 + item.ResultDesc = "不奖不惩"
  577 + } else if v.SummaryResult > 0 {
  578 + item.ResultDesc = "奖"
  579 + } else {
  580 + item.ResultDesc = "惩"
  581 + }
  582 + result = append(result, item)
  583 + }
  584 + return cnt, result, nil
  585 +}
  586 +
  587 +// 创建事故数据
  588 +func (srv ProductTroubleService) CreateProductTrouble(operateInfo *domain.OperateInfo, param *command.CreateProductTroubleCommand) (map[string]interface{}, error) {
  589 + transactionContext, err := factory.CreateTransactionContext(nil)
  590 + if err != nil {
  591 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  592 + }
  593 + if err := transactionContext.StartTransaction(); err != nil {
  594 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  595 + }
  596 + defer func() {
  597 + transactionContext.RollbackTransaction()
  598 + }()
  599 +
  600 + productTroubleRepo, _ := factory.CreateProductTroubleRepository(map[string]interface{}{
  601 + "transactionContext": transactionContext,
  602 + })
  603 + workShopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  604 + "transactionContext": transactionContext,
  605 + })
  606 + //获取车间数据
  607 + workShopData, err := workShopRepo.FindOne(map[string]interface{}{
  608 + "workshopId": param.WorkshopId,
  609 + })
  610 + if err != nil {
  611 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据不能存在"+err.Error())
  612 + }
  613 + if workShopData.CompanyId != operateInfo.CompanyId {
  614 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据填写错误")
  615 + }
  616 + workStation, err := workShopData.FindWorkStation(param.WorkshopId, param.LineId, param.SectionId)
  617 + if err != nil {
  618 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  619 + }
  620 +
  621 + recordDate, err := time.ParseInLocation("2006-01-02", param.RecordDate, time.Local)
  622 + if err != nil {
  623 + return nil, application.ThrowError(application.ARG_ERROR, "日期格式错误")
  624 + }
  625 +
  626 + var operaterUser *domain.User
  627 + userService := domainService.NewUserService()
  628 + operaterUser, err = userService.User(operateInfo.UserId)
  629 + if err != nil {
  630 + return nil, application.ThrowError(application.ARG_ERROR, "获取审核人信息失败,"+err.Error())
  631 + }
  632 + for _, workerId := range param.WorkerId {
  633 + var workerUser *domain.User
  634 + workerUser, err = userService.User(workerId)
  635 + if err != nil {
  636 + return nil, application.ThrowError(application.ARG_ERROR, "获取员工信息失败,"+err.Error())
  637 + }
  638 + var troubleData *domain.ProductTrouble
  639 + if param.Id > 0 {
  640 + troubleData, err = productTroubleRepo.FindOne(map[string]interface{}{
  641 + "id": param.Id,
  642 + })
  643 + if err != nil {
  644 + return nil, application.ThrowError(application.ARG_ERROR, "事故数据填写错误")
  645 + }
  646 + } else {
  647 + troubleData = &domain.ProductTrouble{
  648 + CompanyId: operateInfo.CompanyId,
  649 + OrgId: operateInfo.OrgId,
  650 + CreatedAt: time.Now(),
  651 + ApproveStatus: domain.TroubleWaitApprove,
  652 + }
  653 + }
  654 +
  655 + troubleData.AmountLoss = param.AmountLoss
  656 + troubleData.ProductWorker = *workerUser
  657 + troubleData.RecordDate = recordDate
  658 + troubleData.Remark = param.Remark
  659 + troubleData.UpdatedAt = time.Now()
  660 + troubleData.WorkStation = *workStation
  661 + err = troubleData.SetTypes(param.Types)
  662 + if err != nil {
  663 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  664 + }
  665 + if param.SaveAndApprove {
  666 + err = troubleData.Approve(operaterUser)
  667 + if err != nil {
  668 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  669 + }
  670 + }
  671 + _, err = productTroubleRepo.Save(troubleData)
  672 + if err != nil {
  673 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  674 + }
  675 +
  676 + }
  677 + if err := transactionContext.CommitTransaction(); err != nil {
  678 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  679 + }
  680 + return map[string]interface{}{}, nil
  681 +}
  1 +package command
  2 +
  3 +type SaveRewardRuleCommand struct {
  4 + // RewardTag string `json:"rewardTag"`
  5 + RewardNum int `json:"rewardNum"`
  6 + RewardAmount string `json:"rewardAmount"`
  7 + // FaultTag string `json:"faultTag"`
  8 + FaultNum int `json:"faultNum"`
  9 + FaultAmount string `json:"faultAmount"`
  10 + Remark string `json:"remark"`
  11 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type SaveRewardStandardCommand struct {
  12 + Id int `json:"id"` //奖惩标准 id
  13 + WorkshopId int `json:"workshopId" valid:"Required"` //车间id
  14 + LineId int `json:"lineId" valid:"Required"` //生产线ID
  15 + SectionId int `json:"sectionId" valid:"Required"` //工段ID
  16 + Remark string `json:"remark"` //备注
  17 + TargetType int `json:"targetType" valid:"Required"` //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  18 + TargeVal1 string `json:"targeVal1"` //填写的指标值1
  19 + TargeVal2 string `json:"targeVal2"` //填写的指标值2
  20 + TargeVal3 string `json:"targeVal3"` //填写的指标值3
  21 + TargeVal4 string `json:"targeVal4"` //填写的指标值4
  22 +}
  23 +
  24 +func (removeProductCommand *SaveRewardStandardCommand) Valid(validation *validation.Validation) {
  25 +
  26 +}
  27 +
  28 +func (removeProductCommand *SaveRewardStandardCommand) ValidateCommand() error {
  29 + valid := validation.Validation{}
  30 + b, err := valid.Valid(removeProductCommand)
  31 + if err != nil {
  32 + return err
  33 + }
  34 + if !b {
  35 + elem := reflect.TypeOf(removeProductCommand).Elem()
  36 + for _, validErr := range valid.Errors {
  37 + field, isExist := elem.FieldByName(validErr.Field)
  38 + if isExist {
  39 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  40 + } else {
  41 + return fmt.Errorf(validErr.Message)
  42 + }
  43 + }
  44 + }
  45 + return nil
  46 +}
  1 +package dto
  2 +
  3 +type RewardRuleInfo struct {
  4 + RewardNum int `json:"rewardNum"`
  5 + RewardAmount string `json:"rewardAmount"`
  6 + FaultNum int `json:"faultNum"`
  7 + FaultAmount string `json:"faultAmount"`
  8 + Remark string `json:"remark"`
  9 +}
  1 +package dto
  2 +
  3 +type RewardStandardInfo struct {
  4 + Id int `json:"id"` //奖惩标准id
  5 + WorkshopId int `json:"workshopId"` //车间id
  6 + WorkshopName string `json:"workshopName"` //
  7 + LineId int `json:"lineId"` //生产线ID
  8 + LineName string `json:"lineName"` //
  9 + SectionId int `json:"sectionId"` //工段ID
  10 + SectionName string `json:"sectionName"` //
  11 + Remark string `json:"remark"` //备注
  12 + TargetType int `json:"targetType"` //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  13 + TargeVal1 string `json:"targeVal1"` //填写的指标值1
  14 + TargeVal2 string `json:"targeVal2"` //填写的指标值2
  15 + TargeVal3 string `json:"targeVal3"` //填写的指标值3
  16 + TargeVal4 string `json:"targeVal4"` //填写的指标值4
  17 +
  18 +}
  1 +package dto
  2 +
  3 +type RewardStandardList struct {
  4 + Id int `json:"id"` //奖惩标准id
  5 + WorkshopId int `json:"workshopId"` //车间id
  6 + WorkshopName string `json:"workshopName"` //车间名称
  7 + LineId int `json:"lineId"` //生产线ID
  8 + LineName string `json:"lineName"` //生产线名称
  9 + SectionId int `json:"sectionId"` //工段ID
  10 + SectionName string `json:"sectionName"` //工段名称
  11 + Remark string `json:"remark"` //备注
  12 + TargetType int `json:"targetType"` //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  13 + TargetTypeName string `json:"targetTypeName"` //指标类别
  14 + TargeReward string `json:"targeReward"` //描述功劳指标
  15 + TargeFault string `json:"targeFault"` //描述过失指标
  16 +
  17 +}
  1 +package query
  2 +
  3 +type GetRewardStandard struct {
  4 + Id int `json:"id"`
  5 +}
  1 +package query
  2 +
  3 +type ListRewardStandard struct {
  4 + // 当前公司
  5 + CompanyId int `cname:"当前公司" json:"companyId"`
  6 + // 当前登录的组织
  7 + OrgId int `cname:"当前登录的组织" json:"orgId"`
  8 + // 页码
  9 + PageNumber int `cname:"页码" json:"pageNumber"`
  10 + // 页数
  11 + PageSize int `cname:"页数" json:"pageSize"`
  12 + // 车间名称
  13 + WorkshopName string `cname:"车间名称" json:"workshopName"`
  14 + // 线别名称
  15 + LineName string `cname:"线别名称" json:"lineName"`
  16 + // 工段名称
  17 + SectionName string `cname:"工段名称" json:"sectionName"`
  18 +}
  1 +package service
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "github.com/linmadan/egglib-go/core/application"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/command"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/dto"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/query"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  12 +)
  13 +
  14 +type RewardStandardService struct{}
  15 +
  16 +func NewRewardStandardService(options map[string]interface{}) *RewardStandardService {
  17 + newService := &RewardStandardService{}
  18 + return newService
  19 +}
  20 +
  21 +// SaveRewardStandard 保存奖惩标准数据
  22 +func (srv RewardStandardService) SaveRewardStandard(operateInfo *domain.OperateInfo, param *command.SaveRewardStandardCommand) (*command.SaveRewardStandardCommand, error) {
  23 + if err := param.ValidateCommand(); err != nil {
  24 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  25 + }
  26 + transactionContext, err := factory.CreateTransactionContext(nil)
  27 + if err != nil {
  28 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  29 + }
  30 + if err := transactionContext.StartTransaction(); err != nil {
  31 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  32 + }
  33 + defer func() {
  34 + transactionContext.RollbackTransaction()
  35 + }()
  36 +
  37 + rewardStandardRepo, _ := factory.CreateRewardStandardRepository(map[string]interface{}{
  38 + "transactionContext": transactionContext,
  39 + })
  40 +
  41 + _, dataList, err := rewardStandardRepo.Find(map[string]interface{}{
  42 + "limit": 1,
  43 + "workshopId": param.WorkshopId,
  44 + "lineId": param.LineId,
  45 + "sectionId": param.SectionId,
  46 + "targetType": param.TargetType,
  47 + })
  48 + if err != nil {
  49 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  50 + }
  51 + if len(dataList) > 0 {
  52 + if dataList[0].Id != param.Id {
  53 + return nil, application.ThrowError(application.BUSINESS_ERROR, "当前指标已存在")
  54 + }
  55 + }
  56 + var rewardStandardData *domain.RewardStandard
  57 + if param.Id > 0 {
  58 + rewardStandardData, err = rewardStandardRepo.FindOne(map[string]interface{}{
  59 + "id": param.Id,
  60 + })
  61 + if err != nil {
  62 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据不存在"+err.Error())
  63 + }
  64 + if rewardStandardData.CompanyId != operateInfo.CompanyId {
  65 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据填写错误")
  66 + }
  67 +
  68 + } else {
  69 + rewardStandardData = &domain.RewardStandard{
  70 + CreatedAt: time.Now(),
  71 + }
  72 + }
  73 +
  74 + workShopRepo, _ := factory.CreateWorkshopRepository(map[string]interface{}{
  75 + "transactionContext": transactionContext,
  76 + })
  77 + //获取车间数据
  78 + workShopData, err := workShopRepo.FindOne(map[string]interface{}{
  79 + "workshopId": param.WorkshopId,
  80 + })
  81 + if err != nil {
  82 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据不能存在"+err.Error())
  83 + }
  84 + if workShopData.CompanyId != operateInfo.CompanyId {
  85 + return nil, application.ThrowError(application.ARG_ERROR, "车间数据填写错误")
  86 + }
  87 +
  88 + productLineData, err := workShopData.FindLine(param.LineId)
  89 + if err != nil {
  90 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  91 + }
  92 + productSection, err := productLineData.FindSection(param.SectionId)
  93 + if err != nil {
  94 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  95 + }
  96 + rewardStandardData.UpdatedAt = time.Now()
  97 + rewardStandardData.ProductSection = *productSection
  98 + rewardStandardData.ProductLine = productLineData.SimpleProductLine()
  99 + rewardStandardData.Workshop = workShopData.SimpleWorkshop()
  100 + rewardStandardData.Remark = param.Remark
  101 + rewardStandardData.CompanyId = operateInfo.CompanyId
  102 + rewardStandardData.OrgId = operateInfo.OrgId
  103 + err = rewardStandardData.UpdateTarge(
  104 + param.TargetType,
  105 + param.TargeVal1,
  106 + param.TargeVal2,
  107 + param.TargeVal3,
  108 + param.TargeVal4)
  109 + if err != nil {
  110 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  111 + }
  112 + _, err = rewardStandardRepo.Save(rewardStandardData)
  113 + if err != nil {
  114 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  115 + }
  116 + if err := transactionContext.CommitTransaction(); err != nil {
  117 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  118 + }
  119 + param.Id = rewardStandardData.Id
  120 + return param, nil
  121 +}
  122 +
  123 +// GetRewardStandard 根据id获取奖惩标准数据
  124 +func (srv RewardStandardService) GetRewardStandard(operateInfo *domain.OperateInfo, param *query.GetRewardStandard) (*dto.RewardStandardInfo, error) {
  125 + transactionContext, err := factory.CreateTransactionContext(nil)
  126 + if err != nil {
  127 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  128 + }
  129 + if err := transactionContext.StartTransaction(); err != nil {
  130 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  131 + }
  132 + defer func() {
  133 + transactionContext.RollbackTransaction()
  134 + }()
  135 +
  136 + rewardStandardRepo, _ := factory.CreateRewardStandardRepository(map[string]interface{}{
  137 + "transactionContext": transactionContext,
  138 + })
  139 + rewardStandardData, err := rewardStandardRepo.FindOne(map[string]interface{}{
  140 + "id": param.Id,
  141 + })
  142 + if err != nil {
  143 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据不存在"+err.Error())
  144 + }
  145 + if err := transactionContext.CommitTransaction(); err != nil {
  146 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  147 + }
  148 + if operateInfo.CompanyId != rewardStandardData.CompanyId {
  149 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据不存在")
  150 + }
  151 +
  152 + result := dto.RewardStandardInfo{
  153 + Id: rewardStandardData.Id,
  154 + WorkshopId: rewardStandardData.Workshop.WorkshopId,
  155 + WorkshopName: rewardStandardData.Workshop.WorkshopName,
  156 + LineId: rewardStandardData.ProductLine.LineId,
  157 + LineName: rewardStandardData.ProductLine.LineName,
  158 + SectionId: rewardStandardData.ProductSection.SectionId,
  159 + SectionName: rewardStandardData.ProductSection.SectionName,
  160 + Remark: rewardStandardData.Remark,
  161 + TargetType: rewardStandardData.TargetType,
  162 + TargeVal1: rewardStandardData.TargeVal1,
  163 + TargeVal2: rewardStandardData.TargeVal2,
  164 + TargeVal3: rewardStandardData.TargeVal3,
  165 + TargeVal4: rewardStandardData.TargeVal4,
  166 + }
  167 + return &result, nil
  168 +}
  169 +
  170 +// DeleteRewardStandard 根据id删除奖惩标准
  171 +func (srv RewardStandardService) DeleteRewardStandard(operateInfo *domain.OperateInfo, param *query.GetRewardStandard) (*domain.RewardStandard, error) {
  172 + transactionContext, err := factory.CreateTransactionContext(nil)
  173 + if err != nil {
  174 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  175 + }
  176 + if err := transactionContext.StartTransaction(); err != nil {
  177 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  178 + }
  179 + defer func() {
  180 + transactionContext.RollbackTransaction()
  181 + }()
  182 +
  183 + rewardStandardRepo, _ := factory.CreateRewardStandardRepository(map[string]interface{}{
  184 + "transactionContext": transactionContext,
  185 + })
  186 + rewardStandardData, err := rewardStandardRepo.FindOne(map[string]interface{}{
  187 + "id": param.Id,
  188 + })
  189 + if err != nil {
  190 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据不存在:"+err.Error())
  191 + }
  192 +
  193 + if operateInfo.CompanyId != rewardStandardData.CompanyId {
  194 + return nil, application.ThrowError(application.BUSINESS_ERROR, "指标数据不存在")
  195 + }
  196 + _, err = rewardStandardRepo.Remove(rewardStandardData)
  197 + if err != nil {
  198 + return nil, application.ThrowError(application.BUSINESS_ERROR, "操作指标数据失败"+err.Error())
  199 + }
  200 + if err := transactionContext.CommitTransaction(); err != nil {
  201 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  202 + }
  203 + return rewardStandardData, nil
  204 +}
  205 +
  206 +// ListRewardStandard 奖惩标准列表
  207 +func (srv RewardStandardService) ListRewardStandard(param *query.ListRewardStandard) (int64, []dto.RewardStandardList, error) {
  208 + transactionContext, err := factory.CreateTransactionContext(nil)
  209 + if err != nil {
  210 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  211 + }
  212 + if err := transactionContext.StartTransaction(); err != nil {
  213 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  214 + }
  215 + defer func() {
  216 + transactionContext.RollbackTransaction()
  217 + }()
  218 +
  219 + rewardStandardRepo, _ := factory.CreateRewardStandardRepository(map[string]interface{}{
  220 + "transactionContext": transactionContext,
  221 + })
  222 +
  223 + condition := map[string]interface{}{
  224 + "limit": 20,
  225 + "offset": 0,
  226 + "companyId": param.CompanyId,
  227 + }
  228 + if param.PageSize > 0 {
  229 + condition["limit"] = param.PageSize
  230 + }
  231 + offset := param.PageSize * (param.PageNumber - 1)
  232 + if offset > 0 {
  233 + condition["offset"] = offset
  234 + }
  235 + if len(param.WorkshopName) > 0 {
  236 + condition["workshopName"] = param.WorkshopName
  237 + }
  238 + if len(param.SectionName) > 0 {
  239 + condition["sectionName"] = param.SectionName
  240 + }
  241 + if len(param.LineName) > 0 {
  242 + condition["lineName"] = param.LineName
  243 + }
  244 + cnt, rewardStandardList, err := rewardStandardRepo.Find(condition)
  245 + if err != nil {
  246 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  247 + }
  248 + if err := transactionContext.CommitTransaction(); err != nil {
  249 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  250 + }
  251 + listResult := make([]dto.RewardStandardList, 0)
  252 + var temp dto.RewardStandardList
  253 + for _, v := range rewardStandardList {
  254 + temp = dto.RewardStandardList{
  255 + Id: v.Id,
  256 + WorkshopId: v.Workshop.WorkshopId,
  257 + WorkshopName: v.Workshop.WorkshopName,
  258 + LineId: v.ProductLine.LineId,
  259 + LineName: v.ProductLine.LineName,
  260 + SectionId: v.ProductSection.SectionId,
  261 + SectionName: v.ProductSection.SectionName,
  262 + Remark: v.Remark,
  263 + TargetType: v.TargetType,
  264 + TargetTypeName: v.TargetTypeName(),
  265 + TargeReward: v.ShowTargeReward(),
  266 + TargeFault: v.ShowTargeFault(),
  267 + }
  268 + listResult = append(listResult, temp)
  269 + }
  270 + return cnt, listResult, nil
  271 +}
  272 +
  273 +// SaveRewardRule 保存奖惩规则
  274 +func (srv RewardStandardService) SaveRewardRule(operateInfo *domain.OperateInfo, param *command.SaveRewardRuleCommand) (*command.SaveRewardRuleCommand, error) {
  275 + transactionContext, err := factory.CreateTransactionContext(nil)
  276 + if err != nil {
  277 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  278 + }
  279 + if err := transactionContext.StartTransaction(); err != nil {
  280 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  281 + }
  282 + defer func() {
  283 + transactionContext.RollbackTransaction()
  284 + }()
  285 + rewardRuleRepo, _ := factory.CreateRewardRuleRepository(map[string]interface{}{
  286 + "transactionContext": transactionContext,
  287 + })
  288 + _, ruleList, err := rewardRuleRepo.Find(map[string]interface{}{
  289 + "companyId": operateInfo.CompanyId,
  290 + })
  291 + if err != nil {
  292 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  293 + }
  294 + var newRewardRule *domain.RewardRule
  295 + if len(ruleList) > 0 {
  296 + newRewardRule = ruleList[0]
  297 + } else {
  298 + newRewardRule = &domain.RewardRule{
  299 + CreatedAt: time.Now(),
  300 + CompanyId: operateInfo.CompanyId,
  301 + OrgId: operateInfo.OrgId,
  302 + FaultTag: ">",
  303 + RewardTag: ">",
  304 + }
  305 + }
  306 + newRewardRule.UpdatedAt = time.Now()
  307 + newRewardRule.FaultAmount = param.FaultAmount
  308 + newRewardRule.FaultNum = param.FaultNum
  309 + newRewardRule.RewardAmount = param.RewardAmount
  310 + newRewardRule.RewardNum = param.RewardNum
  311 + newRewardRule.Remark = param.Remark
  312 + _, err = rewardRuleRepo.Save(newRewardRule)
  313 + if err != nil {
  314 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  315 + }
  316 + if err := transactionContext.CommitTransaction(); err != nil {
  317 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  318 + }
  319 + return param, err
  320 +}
  321 +
  322 +// GetRewardRule 获取奖惩规则
  323 +func (srv RewardStandardService) GetRewardRule(operateInfo *domain.OperateInfo) (*dto.RewardRuleInfo, error) {
  324 + transactionContext, err := factory.CreateTransactionContext(nil)
  325 + if err != nil {
  326 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  327 + }
  328 + if err := transactionContext.StartTransaction(); err != nil {
  329 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  330 + }
  331 + defer func() {
  332 + transactionContext.RollbackTransaction()
  333 + }()
  334 + rewardRuleRepo, _ := factory.CreateRewardRuleRepository(map[string]interface{}{
  335 + "transactionContext": transactionContext,
  336 + })
  337 + _, ruleList, err := rewardRuleRepo.Find(map[string]interface{}{
  338 + "companyId": operateInfo.CompanyId,
  339 + })
  340 + if err != nil {
  341 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  342 + }
  343 + if err := transactionContext.CommitTransaction(); err != nil {
  344 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  345 + }
  346 + var newRewardRule *dto.RewardRuleInfo
  347 + if len(ruleList) > 0 {
  348 + newRewardRule = &dto.RewardRuleInfo{
  349 + RewardNum: ruleList[0].RewardNum,
  350 + RewardAmount: ruleList[0].RewardAmount,
  351 + FaultNum: ruleList[0].FaultNum,
  352 + FaultAmount: ruleList[0].RewardAmount,
  353 + Remark: ruleList[0].Remark,
  354 + }
  355 + } else {
  356 + newRewardRule = &dto.RewardRuleInfo{}
  357 + }
  358 + return newRewardRule, nil
  359 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
  9 +)
  10 +
  11 +//车间看板(生产)
  12 +
  13 +// 车间描述
  14 +func (svr *CommonStatisticsService) WorkshopDesc() (interface{}, error) {
  15 + transactionContext, err := factory.CreateTransactionContext(nil)
  16 + if err != nil {
  17 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  18 + }
  19 + if err := transactionContext.StartTransaction(); err != nil {
  20 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  21 + }
  22 + defer func() {
  23 + _ = transactionContext.RollbackTransaction()
  24 + }()
  25 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  26 + workshopDesc, err := boardShowData.WorkshopDesc(
  27 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  28 + constant.MANUFACTURE_DEFAULT_ORGID,
  29 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  30 + )
  31 + if err != nil {
  32 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  33 + }
  34 + //在岗人数
  35 + onDuty, err := boardShowData.OnDutyCount(
  36 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  37 + constant.MANUFACTURE_DEFAULT_ORGID,
  38 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  39 + )
  40 + if err != nil {
  41 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  42 + }
  43 + if err := transactionContext.CommitTransaction(); err != nil {
  44 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  45 + }
  46 + result := map[string]interface{}{
  47 + "lines": workshopDesc.Lines,
  48 + "uname": workshopDesc.Uname,
  49 + "workon": workshopDesc.Workon,
  50 + "workshopName": workshopDesc.WorkshopName,
  51 + "onDuty": onDuty,
  52 + }
  53 + return result, nil
  54 +}
  55 +
  56 +// 员工效率排名
  57 +func (svr *CommonStatisticsService) EmployeeWorkpieceRatio() (interface{}, error) {
  58 + transactionContext, err := factory.CreateTransactionContext(nil)
  59 + if err != nil {
  60 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  61 + }
  62 + if err := transactionContext.StartTransaction(); err != nil {
  63 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  64 + }
  65 + defer func() {
  66 + _ = transactionContext.RollbackTransaction()
  67 + }()
  68 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  69 + result, err := boardShowData.EmployeeWorkpieceRatio(
  70 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  71 + constant.MANUFACTURE_DEFAULT_ORGID,
  72 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  73 + )
  74 + if err != nil {
  75 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  76 + }
  77 + if err := transactionContext.CommitTransaction(); err != nil {
  78 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  79 + }
  80 + listData := map[string]interface{}{
  81 + "list": result,
  82 + }
  83 + return listData, nil
  84 +}
  85 +
  86 +// TimeSectionProductRecord 时段产能
  87 +func (svr *CommonStatisticsService) TimeSectionProductRecord() (interface{}, error) {
  88 + transactionContext, err := factory.CreateTransactionContext(nil)
  89 + if err != nil {
  90 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  91 + }
  92 + if err := transactionContext.StartTransaction(); err != nil {
  93 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  94 + }
  95 + defer func() {
  96 + _ = transactionContext.RollbackTransaction()
  97 + }()
  98 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  99 + // todo
  100 + result, err := boardShowData.TimeSectionProductRecord(
  101 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  102 + constant.MANUFACTURE_DEFAULT_ORGID,
  103 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  104 + 7, 8,
  105 + )
  106 + if err != nil {
  107 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  108 + }
  109 + if err := transactionContext.CommitTransaction(); err != nil {
  110 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  111 + }
  112 + listData := map[string]interface{}{
  113 + "list": result,
  114 + }
  115 + return listData, nil
  116 +}
  117 +
  118 +// TopShow 今日昨日历史最佳
  119 +func (svr *CommonStatisticsService) TopShow() (interface{}, error) {
  120 + transactionContext, err := factory.CreateTransactionContext(nil)
  121 + if err != nil {
  122 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  123 + }
  124 + if err := transactionContext.StartTransaction(); err != nil {
  125 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  126 + }
  127 + defer func() {
  128 + _ = transactionContext.RollbackTransaction()
  129 + }()
  130 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  131 + result, err := boardShowData.TopShow(
  132 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  133 + constant.MANUFACTURE_DEFAULT_ORGID,
  134 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  135 + )
  136 + if err != nil {
  137 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  138 + }
  139 + if err := transactionContext.CommitTransaction(); err != nil {
  140 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  141 + }
  142 + return result, nil
  143 +}
  144 +
  145 +// ProportionOfSecondLevel 二级品占比
  146 +func (svr *CommonStatisticsService) ProportionOfSecondLevel() (interface{}, error) {
  147 + transactionContext, err := factory.CreateTransactionContext(nil)
  148 + if err != nil {
  149 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  150 + }
  151 + if err := transactionContext.StartTransaction(); err != nil {
  152 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  153 + }
  154 + defer func() {
  155 + _ = transactionContext.RollbackTransaction()
  156 + }()
  157 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  158 + result, err := boardShowData.ProportionOfSecondLevel(
  159 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  160 + constant.MANUFACTURE_DEFAULT_ORGID,
  161 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  162 + )
  163 + if err != nil {
  164 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  165 + }
  166 + if err := transactionContext.CommitTransaction(); err != nil {
  167 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  168 + }
  169 + listData := map[string]interface{}{
  170 + "list": result,
  171 + }
  172 + return listData, nil
  173 +}
  174 +
  175 +// SectionProductInfo 工段生产信息
  176 +func (svr *CommonStatisticsService) SectionProductInfo() (interface{}, error) {
  177 + transactionContext, err := factory.CreateTransactionContext(nil)
  178 + if err != nil {
  179 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  180 + }
  181 + if err := transactionContext.StartTransaction(); err != nil {
  182 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  183 + }
  184 + defer func() {
  185 + _ = transactionContext.RollbackTransaction()
  186 + }()
  187 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  188 + result, err := boardShowData.SectionProductInfo(
  189 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  190 + constant.MANUFACTURE_DEFAULT_ORGID,
  191 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  192 + )
  193 + if err != nil {
  194 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  195 + }
  196 + if err := transactionContext.CommitTransaction(); err != nil {
  197 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  198 + }
  199 + listData := map[string]interface{}{
  200 + "list": result,
  201 + }
  202 + return listData, nil
  203 +}
  204 +
  205 +// WorkshopPlanCompletionCurrent 当前计划达成率
  206 +func (svr *CommonStatisticsService) WorkshopPlanCompletionCurrent() (interface{}, error) {
  207 + transactionContext, err := factory.CreateTransactionContext(nil)
  208 + if err != nil {
  209 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  210 + }
  211 + if err := transactionContext.StartTransaction(); err != nil {
  212 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  213 + }
  214 + defer func() {
  215 + _ = transactionContext.RollbackTransaction()
  216 + }()
  217 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  218 + result, err := boardShowData.WorkshopPlanCompletionCurrent(
  219 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  220 + constant.MANUFACTURE_DEFAULT_ORGID,
  221 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  222 + )
  223 + if err != nil {
  224 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  225 + }
  226 + if err := transactionContext.CommitTransaction(); err != nil {
  227 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  228 + }
  229 + listData := map[string]interface{}{
  230 + "rate": result,
  231 + }
  232 + return listData, nil
  233 +}
  234 +
  235 +// WorkshopPlanCompletion5Day 近5天计划达成率
  236 +func (svr *CommonStatisticsService) WorkshopPlanCompletion5Day() (interface{}, error) {
  237 + transactionContext, err := factory.CreateTransactionContext(nil)
  238 + if err != nil {
  239 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  240 + }
  241 + if err := transactionContext.StartTransaction(); err != nil {
  242 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  243 + }
  244 + defer func() {
  245 + _ = transactionContext.RollbackTransaction()
  246 + }()
  247 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  248 + result, err := boardShowData.WorkshopPlanCompletion5Day(
  249 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  250 + constant.MANUFACTURE_DEFAULT_ORGID,
  251 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  252 + )
  253 + if err != nil {
  254 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  255 + }
  256 + if err := transactionContext.CommitTransaction(); err != nil {
  257 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  258 + }
  259 + listData := map[string]interface{}{
  260 + "list": result,
  261 + }
  262 + return listData, nil
  263 +}
  264 +
  265 +// 批次产能
  266 +func (svr *CommonStatisticsService) ProductPlan() (interface{}, error) {
  267 + transactionContext, err := factory.CreateTransactionContext(nil)
  268 + if err != nil {
  269 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  270 + }
  271 + if err := transactionContext.StartTransaction(); err != nil {
  272 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  273 + }
  274 + defer func() {
  275 + _ = transactionContext.RollbackTransaction()
  276 + }()
  277 + boardShowData, _ := dao.NewBoardShowDao(transactionContext.(*pgTransaction.TransactionContext))
  278 + result, err := boardShowData.ProductPlan(
  279 + constant.MANUFACTURE_DEFAULT_COMPANYID,
  280 + constant.MANUFACTURE_DEFAULT_ORGID,
  281 + constant.MANUFACTURE_DEFAULT_WORKSHOPID,
  282 + )
  283 + if err != nil {
  284 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  285 + }
  286 + if err := transactionContext.CommitTransaction(); err != nil {
  287 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  288 + }
  289 + listData := map[string]interface{}{
  290 + "list": result,
  291 + }
  292 + return listData, nil
  293 +}
@@ -12,6 +12,11 @@ import ( @@ -12,6 +12,11 @@ import (
12 type CommonStatisticsService struct { 12 type CommonStatisticsService struct {
13 } 13 }
14 14
  15 +func NewCommonStatisticsService(options map[string]interface{}) *CommonStatisticsService {
  16 + newProductSectionService := &CommonStatisticsService{}
  17 + return newProductSectionService
  18 +}
  19 +
15 // CommonStatisticsService 通用的统计服务 20 // CommonStatisticsService 通用的统计服务
16 func (svr *CommonStatisticsService) CommonStatisticsService(cmd *query.CommonStatisticsQuery) (interface{}, error) { 21 func (svr *CommonStatisticsService) CommonStatisticsService(cmd *query.CommonStatisticsQuery) (interface{}, error) {
17 if err := cmd.ValidateQuery(); err != nil { 22 if err := cmd.ValidateQuery(); err != nil {
@@ -39,8 +44,3 @@ func (svr *CommonStatisticsService) CommonStatisticsService(cmd *query.CommonSta @@ -39,8 +44,3 @@ func (svr *CommonStatisticsService) CommonStatisticsService(cmd *query.CommonSta
39 } 44 }
40 return response, nil 45 return response, nil
41 } 46 }
42 -  
43 -func NewCommonStatisticsService(options map[string]interface{}) *CommonStatisticsService {  
44 - newProductSectionService := &CommonStatisticsService{}  
45 - return newProductSectionService  
46 -}  
@@ -2,10 +2,11 @@ package constant @@ -2,10 +2,11 @@ package constant
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 +
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
6 ) 7 )
7 8
8 -//var Configurator utils.Configurator = utils.NewConfig("ini","config/app_test.conf") 9 +// var Configurator utils.Configurator = utils.NewConfig("ini","config/app_test.conf")
9 var Configurator utils.Configurator = utils.EnvConfigurator{} 10 var Configurator utils.Configurator = utils.EnvConfigurator{}
10 11
11 var SERVICE_NAME = "allied-creation-manufacture" 12 var SERVICE_NAME = "allied-creation-manufacture"
@@ -16,13 +17,14 @@ var LOG_LEVEL = "debug" @@ -16,13 +17,14 @@ var LOG_LEVEL = "debug"
16 var LOG_FILE = "app.log" 17 var LOG_FILE = "app.log"
17 var PPROF_ON = true 18 var PPROF_ON = true
18 19
19 -//天联共创基础模块 20 +// 天联共创基础模块
20 var ALLIED_CREATION_BASIC_HOST = "http://localhost:8080" //"http://allied-creation-basic-dev.fjmaimaimai.com" 21 var ALLIED_CREATION_BASIC_HOST = "http://localhost:8080" //"http://allied-creation-basic-dev.fjmaimaimai.com"
21 22
22 -//天联共创用户模块  
23 -var ALLIED_CREATION_USER_HOST = "http://localhost:8081" //"http://allied-creation-user-dev.fjmaimaimai.com" 23 +// 天联共创用户模块
  24 +// svar ALLIED_CREATION_USER_HOST = "http://localhost:8081"
  25 +var ALLIED_CREATION_USER_HOST = "http://allied-creation-user-test.fjmaimaimai.com"
24 26
25 -//天联共创业务模块 27 +// 天联共创业务模块
26 var ALLIED_CREATION_COOPERATION_HOST = "http://localhost:8082" // "http://allied-creation-cooperation-dev.fjmaimaimai.com" 28 var ALLIED_CREATION_COOPERATION_HOST = "http://localhost:8082" // "http://allied-creation-cooperation-dev.fjmaimaimai.com"
27 29
28 var MMM_BYTE_BANK_HOST = "http://220.250.41.79:8301" 30 var MMM_BYTE_BANK_HOST = "http://220.250.41.79:8301"
@@ -28,7 +28,7 @@ var MQTT_HOST = "47.97.5.102" @@ -28,7 +28,7 @@ var MQTT_HOST = "47.97.5.102"
28 var MQTT_PORT = "6000" 28 var MQTT_PORT = "6000"
29 var MQTT_USER = "admin" 29 var MQTT_USER = "admin"
30 var MQTT_PASSWORD = "123456" 30 var MQTT_PASSWORD = "123456"
31 -var MQTT_UP = true 31 +var MQTT_UP = false
32 32
33 func init() { 33 func init() {
34 MQTT_HOST = Configurator.DefaultString("MQTT_HOST", MQTT_HOST) 34 MQTT_HOST = Configurator.DefaultString("MQTT_HOST", MQTT_HOST)
@@ -3,11 +3,11 @@ @@ -3,11 +3,11 @@
3 3
4 package constant 4 package constant
5 5
6 -var POSTGRESQL_DB_NAME = "terms" 6 +var POSTGRESQL_DB_NAME = "allied_creation_test"
7 var POSTGRESQL_USER = "postgres" 7 var POSTGRESQL_USER = "postgres"
8 -var POSTGRESQL_PASSWORD = "123456"  
9 -var POSTGRESQL_HOST = "127.0.0.1"  
10 -var POSTGRESQL_PORT = "5432" 8 +var POSTGRESQL_PASSWORD = "eagle1010"
  9 +var POSTGRESQL_HOST = "114.55.200.59"
  10 +var POSTGRESQL_PORT = "31543"
11 var DISABLE_CREATE_TABLE = false 11 var DISABLE_CREATE_TABLE = false
12 var DISABLE_SQL_GENERATE_PRINT = false 12 var DISABLE_SQL_GENERATE_PRINT = false
13 var DISABLE_SQL_GENERATE_COMMENT = true 13 var DISABLE_SQL_GENERATE_COMMENT = true
@@ -3,10 +3,11 @@ package domain @@ -3,10 +3,11 @@ package domain
3 import ( 3 import (
4 "errors" 4 "errors"
5 "fmt" 5 "fmt"
  6 + "time"
  7 +
6 "github.com/linmadan/egglib-go/utils/xtime" 8 "github.com/linmadan/egglib-go/utils/xtime"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
9 - "time"  
10 ) 11 )
11 12
12 const ( 13 const (
@@ -159,6 +160,9 @@ func (productAttendanceRecord *ProductAttendanceRecord) Approve(approveUser *Use @@ -159,6 +160,9 @@ func (productAttendanceRecord *ProductAttendanceRecord) Approve(approveUser *Use
159 } 160 }
160 161
161 func (productAttendanceRecord *ProductAttendanceRecord) ProductTime() time.Time { 162 func (productAttendanceRecord *ProductAttendanceRecord) ProductTime() time.Time {
  163 + if productAttendanceRecord.Ext == nil {
  164 + return time.Time{}
  165 + }
162 attendanceExt := productAttendanceRecord.Ext.AttendanceExt 166 attendanceExt := productAttendanceRecord.Ext.AttendanceExt
163 if attendanceExt != nil && !xtime.IsZero(productAttendanceRecord.ProductDate) { 167 if attendanceExt != nil && !xtime.IsZero(productAttendanceRecord.ProductDate) {
164 return productAttendanceRecord.ProductDate 168 return productAttendanceRecord.ProductDate
@@ -230,3 +234,12 @@ func (productAttendanceRecord *ProductAttendanceRecord) AttendanceBreakTime(prod @@ -230,3 +234,12 @@ func (productAttendanceRecord *ProductAttendanceRecord) AttendanceBreakTime(prod
230 } 234 }
231 return bt 235 return bt
232 } 236 }
  237 +
  238 +// 计算上岗到 离岗之间的工作时间,
  239 +// breakTime 休息时间(小时)
  240 +func (productAttendanceRecord *ProductAttendanceRecord) ComputeWorkTime(breakTime float64) float64 {
  241 + signIn := roundTime(productAttendanceRecord.SignIn)
  242 + signOut := roundTime(productAttendanceRecord.SignOut)
  243 + wt := utils.Round(signOut.Sub(signIn).Hours()-breakTime, 2)
  244 + return roundWorkTime(wt)
  245 +}
@@ -14,6 +14,12 @@ type ProductLine struct { @@ -14,6 +14,12 @@ type ProductLine struct {
14 Removed int `json:"removed,omitempty"` 14 Removed int `json:"removed,omitempty"`
15 } 15 }
16 16
  17 +//输出简化的模型
  18 +type SimpleProductLine struct {
  19 + LineId int `json:"lineId"` // 生产线ID
  20 + LineName string `json:"lineName"` // 生产线名称
  21 +}
  22 +
17 // 查询生产线 23 // 查询生产线
18 func (productLine *ProductLine) FindSection(sectionId int) (*ProductSection, error) { 24 func (productLine *ProductLine) FindSection(sectionId int) (*ProductSection, error) {
19 for i := range productLine.ProductSections { 25 for i := range productLine.ProductSections {
@@ -37,3 +43,11 @@ func (productLine *ProductLine) GetProductSections(removed int) []*ProductSectio @@ -37,3 +43,11 @@ func (productLine *ProductLine) GetProductSections(removed int) []*ProductSectio
37 } 43 }
38 return result 44 return result
39 } 45 }
  46 +
  47 +//SimpleProductLine 输出简化的模型
  48 +func (productLine *ProductLine) SimpleProductLine() SimpleProductLine {
  49 + return SimpleProductLine{
  50 + LineId: productLine.LineId,
  51 + LineName: productLine.LineName,
  52 + }
  53 +}
1 package domain 1 package domain
2 2
3 import ( 3 import (
4 - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"  
5 "time" 4 "time"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
6 ) 7 )
7 8
8 const ( 9 const (
@@ -7,6 +7,8 @@ type ProductRecordStaticInfo struct { @@ -7,6 +7,8 @@ type ProductRecordStaticInfo struct {
7 ProductDate string `json:"productDate"` 7 ProductDate string `json:"productDate"`
8 // 生产计划ID 8 // 生产计划ID
9 ProductPlanId int `json:"productPlanId,omitempty"` 9 ProductPlanId int `json:"productPlanId,omitempty"`
  10 +
  11 + PlanProductCode string `json:"planProductCode"`
10 // 计划的产品名称 12 // 计划的产品名称
11 PlanProductName string `json:"planProductName,omitempty"` 13 PlanProductName string `json:"planProductName,omitempty"`
12 // 批号 14 // 批号
  1 +package domain
  2 +
  3 +import (
  4 + "errors"
  5 + "time"
  6 +)
  7 +
  8 +// 事故管理数据结构
  9 +type ProductTrouble struct {
  10 + Id int `json:"id"` // id
  11 + CompanyId int `json:"companyId"` // 企业id
  12 + OrgId int `json:"orgId"` // 组织ID
  13 + WorkStation WorkStation `json:"workStation"` // 工作位置
  14 + ProductWorker User `json:"productWorker,omitempty"` // 生产工人
  15 + AmountLoss float64 `json:"amountLoss"` // 损失的金额
  16 + Types TroubleType `json:"types"` // 事故类型 1 安全事故 ,2 质量事故, 3 金属事故 ,4 非金属事故
  17 + RecordDate time.Time `json:"recordDate"` // 事故发生的日期
  18 + Remark string `json:"remakr"` // 备注
  19 + ApproveStatus ProductTroubleApprove `json:"approveStatus"` // 审核状态 1:未审核 2:已审核 3.自动审核
  20 + ApproveAt *time.Time `json:"approveAt"` // 审核时间
  21 + ApproveUser *User `json:"approveUser"` // 审核人
  22 + CreatedAt time.Time `json:"createdAt,omitempty"` // 创建时间
  23 + UpdatedAt time.Time `json:"updatedAt,omitempty"` // 更新时间
  24 + DeletedAt *time.Time `json:"deletedAt,omitempty"` // 删除时间
  25 +}
  26 +
  27 +// 事故类型
  28 +type TroubleType string
  29 +
  30 +// 事故类型 1 安全事故 ,2 质量事故, 3 金属事故 ,4 非金属事故
  31 +const (
  32 + TroubleType1 TroubleType = "安全事故"
  33 + TroubleType2 TroubleType = "质量事故"
  34 + TroubleType3 TroubleType = "金属事故"
  35 + TroubleType4 TroubleType = "非金属事故"
  36 +)
  37 +
  38 +// 事故管理 审核状态
  39 +type ProductTroubleApprove int
  40 +
  41 +// 审核状态 1:未审核 2:已审核
  42 +const (
  43 + TroubleWaitApprove ProductTroubleApprove = 1
  44 + TroubleIsApprove ProductTroubleApprove = 2
  45 +)
  46 +
  47 +type ProductTroubleRepository interface {
  48 + Save(param *ProductTrouble) (*ProductTrouble, error)
  49 + Remove(param *ProductTrouble) (*ProductTrouble, error)
  50 + FindOne(queryOptions map[string]interface{}) (*ProductTrouble, error)
  51 + Find(queryOptions map[string]interface{}) (int64, []*ProductTrouble, error)
  52 +}
  53 +
  54 +func (m *ProductTrouble) SetTypes(v string) error {
  55 + troubleType := TroubleType(v)
  56 + switch troubleType {
  57 + case TroubleType1, TroubleType2, TroubleType3, TroubleType4:
  58 + m.Types = troubleType
  59 + default:
  60 + return errors.New("ProductTrouble.Types 值错误")
  61 + }
  62 + return nil
  63 +}
  64 +
  65 +// 审核事故数据
  66 +func (m *ProductTrouble) Approve(approveUser *User) error {
  67 + nowTime := time.Now()
  68 + switch m.ApproveStatus {
  69 + case TroubleIsApprove:
  70 + return errors.New("事故不需要重复审核")
  71 + default:
  72 + m.ApproveAt = &nowTime
  73 + m.ApproveStatus = TroubleIsApprove
  74 + m.ApproveUser = approveUser
  75 + }
  76 + return nil
  77 +}
  78 +
  79 +func (m *ProductTrouble) GetApproveStatusName() string {
  80 + switch m.ApproveStatus {
  81 + case TroubleWaitApprove:
  82 + return "未审核"
  83 + case TroubleIsApprove:
  84 + return "已审核"
  85 + }
  86 + return ""
  87 +}
  88 +
  89 +func (m *ProductTrouble) GetTypesName() string {
  90 + switch m.Types {
  91 + case TroubleType1:
  92 + return "安全事故"
  93 + case TroubleType2:
  94 + return "质量事故"
  95 + case TroubleType3:
  96 + return "金属事故"
  97 + case TroubleType4:
  98 + return "非金属事故"
  99 + }
  100 + return ""
  101 +}
  1 +package domain
  2 +
  3 +import (
  4 + "strconv"
  5 + "time"
  6 +)
  7 +
  8 +// RewardStandard 奖惩规则
  9 +type RewardRule struct {
  10 + Id int `json:"id"` //奖惩规则id
  11 + CompanyId int `json:"companyId"` //企业id
  12 + OrgId int `json:"orgId"` //组织ID
  13 + RewardTag string `json:"rewardTag"`
  14 + RewardNum int `json:"rewardNum"`
  15 + RewardAmount string `json:"rewardAmount"`
  16 + FaultTag string `json:"faultTag"`
  17 + FaultNum int `json:"faultNum"`
  18 + FaultAmount string `json:"faultAmount"`
  19 + Remark string `json:"remark"`
  20 + CreatedAt time.Time
  21 + UpdatedAt time.Time
  22 +}
  23 +
  24 +type RewardRuleRepository interface {
  25 + Save(param *RewardRule) (*RewardRule, error)
  26 + FindOne(queryOptions map[string]interface{}) (*RewardRule, error)
  27 + Find(queryOptions map[string]interface{}) (int64, []*RewardRule, error)
  28 +}
  29 +
  30 +func (m *RewardRule) ValidRewardTag() bool {
  31 + switch m.RewardTag {
  32 + case ">":
  33 + default:
  34 + return false
  35 + }
  36 + return true
  37 +}
  38 +
  39 +func (m *RewardRule) ValidFaultTag() bool {
  40 + switch m.FaultTag {
  41 + case ">":
  42 + default:
  43 + return false
  44 + }
  45 + return true
  46 +}
  47 +
  48 +// 计算奖惩 的金额
  49 +func (m *RewardRule) SumRewardAmount(rewardNum int, faultNum int) float64 {
  50 + result := float64(0)
  51 + rewardAmount, _ := strconv.ParseFloat(m.RewardAmount, 64)
  52 + faultAmount, _ := strconv.ParseFloat(m.FaultAmount, 64)
  53 + if rewardNum > m.RewardNum {
  54 + result += rewardAmount
  55 + }
  56 + if faultNum > m.FaultNum {
  57 + result -= faultAmount
  58 + }
  59 + return result
  60 +}
  1 +package domain
  2 +
  3 +import (
  4 + "errors"
  5 + "fmt"
  6 + "strconv"
  7 + "time"
  8 +)
  9 +
  10 +// RewardStandard 奖惩标准
  11 +type RewardStandard struct {
  12 + Id int `json:"id"` //奖惩标准id
  13 + CompanyId int `json:"companyId"` //企业id
  14 + OrgId int `json:"orgId"` //组织ID
  15 + Workshop SimpleWorkshop `json:"workshop"` //车间id
  16 + ProductLine SimpleProductLine `json:"productLine"` //生产线
  17 + ProductSection ProductSection `json:"ProductSection"` //工段
  18 + Remark string `json:"remark"` //备注
  19 + TargetType int `json:"targetType"` //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  20 + TargeVal1 string `json:"targeVal1"` //填写的指标值1
  21 + TargeVal2 string `json:"targeVal2"` //填写的指标值2
  22 + TargeVal3 string `json:"targeVal3"` //填写的指标值3
  23 + TargeVal4 string `json:"targeVal4"` //填写的指标值4
  24 + CreatedAt time.Time `json:"createdAt"` //创建时间
  25 + UpdatedAt time.Time `json:"updatedAt"` //更新时间
  26 + DeletedAt *time.Time `json:"-"` //删除时间
  27 +}
  28 +
  29 +/*
  30 +填写的指标值描述
  31 +产效=> 功: 大于等于 x kg/小时;过:小于 x kg/小时
  32 +合格率=> 功:大于等于 x% ;过:小于 x%
  33 +安全事故 => 功:小于等于 x 次 或者 损失小于等于 x 元;过:大于 x 次 或 损失大于 x 元
  34 +质量事故 => 功:小于等于 x 次 或者 损失 小于等于 x 元;过:大于 x 次 或者 损失大于 x 元
  35 +异物次数 => 功:发现金属小于等于 x 次 或者 发现非金属小于等于 x 次
  36 + 过:发现金属大于 x 次 或 发现非金数大于 x 次
  37 +
  38 +*/
  39 +
  40 +type RewardStandardRepository interface {
  41 + Save(param *RewardStandard) (*RewardStandard, error)
  42 + Remove(param *RewardStandard) (*RewardStandard, error)
  43 + FindOne(queryOptions map[string]interface{}) (*RewardStandard, error)
  44 + Find(queryOptions map[string]interface{}) (int64, []*RewardStandard, error)
  45 +}
  46 +
  47 +// 指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  48 +const (
  49 + TargetType1 int = 1
  50 + TargetType2 int = 2
  51 + TargetType3 int = 3
  52 + TargetType4 int = 4
  53 + TargetType5 int = 5
  54 +)
  55 +
  56 +// UpdateTarge 更新指标内容
  57 +func (m *RewardStandard) UpdateTarge(targetType int, targeVal1 string, targeVal2 string, targeVal3 string, targeVal4 string) error {
  58 + switch targetType {
  59 + case TargetType1, TargetType2:
  60 + if len(targeVal1) == 0 || len(targeVal2) == 0 {
  61 + return errors.New("功过指标内容不能为空")
  62 + }
  63 + _, err := strconv.Atoi(targeVal1)
  64 + if err != nil {
  65 + return errors.New("功过指标内容需要为整数")
  66 + }
  67 + _, err = strconv.Atoi(targeVal2)
  68 + if err != nil {
  69 + return errors.New("功过指标内容需要为整数")
  70 + }
  71 + m.TargetType = targetType
  72 + m.TargeVal1 = targeVal1
  73 + m.TargeVal2 = targeVal2
  74 + m.TargeVal3 = ""
  75 + m.TargeVal4 = ""
  76 + case TargetType3, TargetType4, TargetType5:
  77 + if len(targeVal1) == 0 || len(targeVal2) == 0 || len(targeVal3) == 0 || len(targeVal4) == 0 {
  78 + return errors.New("功过指标内容不能为空")
  79 + }
  80 + _, err := strconv.Atoi(targeVal1)
  81 + if err != nil {
  82 + return errors.New("功过指标内容需要为整数")
  83 + }
  84 + _, err = strconv.Atoi(targeVal2)
  85 + if err != nil {
  86 + return errors.New("功过指标内容需要为整数")
  87 + }
  88 + _, err = strconv.Atoi(targeVal3)
  89 + if err != nil {
  90 + return errors.New("功过指标内容需要为整数")
  91 + }
  92 + _, err = strconv.Atoi(targeVal4)
  93 + if err != nil {
  94 + return errors.New("功过指标内容需要为整数")
  95 + }
  96 + m.TargetType = targetType
  97 + m.TargeVal1 = targeVal1
  98 + m.TargeVal2 = targeVal2
  99 + m.TargeVal3 = targeVal3
  100 + m.TargeVal4 = targeVal4
  101 + default:
  102 + return errors.New("指标类型填写错误")
  103 +
  104 + }
  105 + return nil
  106 +}
  107 +
  108 +// TargetTypeName
  109 +func (m *RewardStandard) TargetTypeName() string {
  110 + switch m.TargetType {
  111 + case TargetType1:
  112 + return "产效"
  113 + case TargetType2:
  114 + return "合格率"
  115 + case TargetType3:
  116 + return "安全事故"
  117 + case TargetType4:
  118 + return "质量事故"
  119 + case TargetType5:
  120 + return "异物次数"
  121 + }
  122 + return ""
  123 +}
  124 +
  125 +// ShowTargeReward 功过指标描述,功劳
  126 +func (m *RewardStandard) ShowTargeReward() string {
  127 + show := ""
  128 + switch m.TargetType {
  129 + case TargetType1:
  130 + show = fmt.Sprintf(">=%skg/小时", m.TargeVal1)
  131 + case TargetType2:
  132 + show = fmt.Sprintf(">=%s%%", m.TargeVal1)
  133 + case TargetType3:
  134 + show = fmt.Sprintf("<=%s次或损失<=%s元", m.TargeVal1, m.TargeVal2)
  135 + case TargetType4:
  136 + show = fmt.Sprintf("<=%s次或损失<=%s元", m.TargeVal1, m.TargeVal2)
  137 + case TargetType5:
  138 + show = fmt.Sprintf("金属<=%s次或非金属<=%s", m.TargeVal1, m.TargeVal2)
  139 + }
  140 + return show
  141 +}
  142 +
  143 +// ShowTargeFault 功过指标描述,过失
  144 +func (m *RewardStandard) ShowTargeFault() string {
  145 + show := ""
  146 + switch m.TargetType {
  147 + case TargetType1:
  148 + show = fmt.Sprintf("<%skg/小时", m.TargeVal2)
  149 + case TargetType2:
  150 + show = fmt.Sprintf("<%s%%", m.TargeVal2)
  151 + case TargetType3:
  152 + show = fmt.Sprintf(">%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
  153 + case TargetType4:
  154 + show = fmt.Sprintf("<=%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
  155 + case TargetType5:
  156 + show = fmt.Sprintf("金属>%s次或非金属>%s", m.TargeVal3, m.TargeVal4)
  157 + }
  158 + return show
  159 +}
  160 +
  161 +// 判定功过, 指标类别 1:产效
  162 +// param1 产效值
  163 +// 功过结果 0 无,1 功 ,-1 过;
  164 +func (m *RewardStandard) VerdictTargetType1(param1 float64) int {
  165 + val1, _ := strconv.ParseFloat(m.TargeVal1, 64)
  166 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  167 + result := 0
  168 + if param1 > val1 {
  169 + result = 1
  170 + } else if param1 < val2 {
  171 + result = -1
  172 + }
  173 + return result
  174 +}
  175 +
  176 +// 判定功过, 指标类别 2:合格率
  177 +// param1 合格率
  178 +// 功过结果 0 无,1 功 ,-1 过;
  179 +func (m *RewardStandard) VerdictTargetType2(param1 float64) int {
  180 + val1, _ := strconv.ParseFloat(m.TargeVal1, 64)
  181 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  182 + result := 0
  183 + if param1 > val1 {
  184 + result = 1
  185 + } else if param1 < val2 {
  186 + result = -1
  187 + }
  188 + return result
  189 +}
  190 +
  191 +// 判定功过, 指标类别 3:安全事故;
  192 +// param1 安全事故次数;
  193 +// param1 损失金额;
  194 +// 功过结果 0 无,1 功 ,-1 过;
  195 +func (m *RewardStandard) VerdictTargetType3(param1 int, param2 float64) int {
  196 + val1, _ := strconv.Atoi(m.TargeVal1)
  197 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  198 + result := 0
  199 + //判定功
  200 + if param1 <= val1 {
  201 + result = 1
  202 + }
  203 + if param2 <= val2 {
  204 + result = 1
  205 + }
  206 + //判定过
  207 + val3, _ := strconv.Atoi(m.TargeVal3)
  208 + val4, _ := strconv.ParseFloat(m.TargeVal4, 64)
  209 +
  210 + if param1 > val3 {
  211 + result = -1
  212 + }
  213 + if param2 > val4 {
  214 + result = -1
  215 + }
  216 + return result
  217 +}
  218 +
  219 +// 判定功过, 指标类别 4:质量事故;
  220 +// param1 质量事故 次数;
  221 +// param1 损失金额;
  222 +// 功过结果 0 无,1 功 ,-1 过;
  223 +func (m *RewardStandard) VerdictTargetType4(param1 int, param2 float64) int {
  224 + val1, _ := strconv.Atoi(m.TargeVal1)
  225 + val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
  226 + result := 0
  227 + //判定功
  228 + if param1 <= val1 {
  229 + result = 1
  230 + }
  231 + if param2 <= val2 {
  232 + result = 1
  233 + }
  234 + //判定过
  235 + val3, _ := strconv.Atoi(m.TargeVal3)
  236 + val4, _ := strconv.ParseFloat(m.TargeVal4, 64)
  237 +
  238 + if param1 > val3 {
  239 + result = -1
  240 + }
  241 + if param2 > val4 {
  242 + result = -1
  243 + }
  244 + return result
  245 +}
  246 +
  247 +// 判定功过, 指标类别 5:异物次数;
  248 +// param1 金属异物 次数;
  249 +// param2 非金属 次数;
  250 +// 功过结果 0 无,1 功 ,-1 过;
  251 +func (m *RewardStandard) VerdictTargetType5(param1 int, param2 int) int {
  252 + val1, _ := strconv.Atoi(m.TargeVal1)
  253 + val2, _ := strconv.Atoi(m.TargeVal2)
  254 + result := 0
  255 + //判定功
  256 + if param1 <= val1 {
  257 + result = 1
  258 + }
  259 + if param2 <= val2 {
  260 + result = 1
  261 + }
  262 + //判定过
  263 + val3, _ := strconv.Atoi(m.TargeVal3)
  264 + val4, _ := strconv.Atoi(m.TargeVal4)
  265 +
  266 + if param1 > val3 {
  267 + result = -1
  268 + }
  269 + if param2 > val4 {
  270 + result = -1
  271 + }
  272 + return result
  273 +}
  1 +package domain
  2 +
  3 +import (
  4 + "time"
  5 +)
  6 +
  7 +// RewardSummary 功过奖惩明细
  8 +type RewardSummary struct {
  9 + Id int `json:"id"`
  10 + CompanyId int `json:"companyId"`
  11 + OrgId int `json:"orgId"`
  12 + RecordDate time.Time `json:"recordDate"` //日期
  13 + RecordDateStr string `json:"recordDateStr"` //
  14 + WorkStation WorkStation `json:"workStation"` //工作位置
  15 + Worker User `json:"user"` //员工
  16 + UpToStandard float64 `json:"upToStandard"` //合格率
  17 + UpToStandardResult int `json:"upToStandardResult"` //合格率 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
  18 + Yield float64 `json:"yield"` //产能
  19 + YieldResult int `json:"yieldResult"` //产能 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
  20 + AccidentNum1 int `json:"accidentNum1"` //质量事故 次数
  21 + AccidentAmount1 float64 `json:"accidentAmount1"` //质量事故 损失金额
  22 + AccidentResult1 int `json:"accidentResult1"` //质量事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
  23 + AccidentNum2 int `json:"accidentNum2"` //安全事故 次数
  24 + AccidentAmount2 float64 `json:"accidentAmount2"` //安全事故 损失金额
  25 + AccidentResult2 int `json:"accidentResult2"` //安全事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
  26 + AccidentNum3 int `json:"accidentNum3"` //异物金属事故 次数
  27 + AccidentResult3 int `json:"accidentResult3"` //异物事故 功过评定结果 1`功` -1 `过` 0 `不奖不惩`
  28 + AccidentNum4 int `json:"accidentNum4"` //异物非金属事故次数
  29 + SummaryResult float64 `json:"summaryResult"` //奖惩金额计算结果(元)
  30 + CreatedAt time.Time `json:"createdAt"` //
  31 + UpdatedAt time.Time `json:"UpdatedAt"` //
  32 +}
  33 +
  34 +type RewardSummaryRepository interface {
  35 + Save(param *RewardSummary) (*RewardSummary, error)
  36 + FindOne(queryOptions map[string]interface{}) (*RewardSummary, error)
  37 + Find(queryOptions map[string]interface{}) (int64, []*RewardSummary, error)
  38 +}
  39 +
  40 +// SummaryAccident 汇总事故数据
  41 +func (c *RewardSummary) SummaryAccident(trouble *ProductTrouble, rewardStandard *RewardStandard) {
  42 + switch trouble.Types {
  43 + case TroubleType1:
  44 + c.AccidentNum2 = +1
  45 + c.AccidentAmount2 = +trouble.AmountLoss
  46 + if rewardStandard == nil {
  47 + c.AccidentResult2 = 0
  48 + } else {
  49 + r := rewardStandard.VerdictTargetType3(c.AccidentNum2, c.AccidentAmount2)
  50 + c.AccidentResult2 = r
  51 + }
  52 +
  53 + case TroubleType2:
  54 + c.AccidentNum1 = +1
  55 + c.AccidentAmount1 = +trouble.AmountLoss
  56 + if rewardStandard == nil {
  57 + c.AccidentResult1 = 0
  58 + } else {
  59 + r := rewardStandard.VerdictTargetType4(c.AccidentNum1, c.AccidentAmount1)
  60 + c.AccidentResult2 = r
  61 + }
  62 +
  63 + case TroubleType3:
  64 + c.AccidentNum3 = +1
  65 + if rewardStandard == nil {
  66 + c.AccidentResult3 = 0
  67 + } else {
  68 + r := rewardStandard.VerdictTargetType5(c.AccidentNum3, 0)
  69 + c.AccidentResult2 = r
  70 + }
  71 +
  72 + case TroubleType4:
  73 + c.AccidentNum4 = +1
  74 + if rewardStandard != nil {
  75 + r := rewardStandard.VerdictTargetType5(0, c.AccidentNum4)
  76 + c.AccidentResult2 = r
  77 + }
  78 + }
  79 +}
  80 +
  81 +func (c *RewardSummary) ApplySummaryResult(rule *RewardRule) {
  82 + rewardNum := 0
  83 + faultNum := 0
  84 + if c.AccidentResult1 < 0 {
  85 + faultNum = +1
  86 + } else if c.AccidentResult1 > 0 {
  87 + rewardNum = +1
  88 + }
  89 + if c.AccidentResult2 < 0 {
  90 + faultNum = +1
  91 + } else if c.AccidentResult2 > 0 {
  92 + rewardNum = +1
  93 + }
  94 + if c.AccidentResult3 < 0 {
  95 + faultNum = +1
  96 + } else if c.AccidentResult3 > 0 {
  97 + rewardNum = +1
  98 + }
  99 + if c.YieldResult < 0 {
  100 + faultNum = +1
  101 + } else if c.YieldResult > 0 {
  102 + rewardNum = +1
  103 + }
  104 + if c.UpToStandardResult < 0 {
  105 + faultNum = +1
  106 + } else if c.UpToStandardResult > 0 {
  107 + rewardNum = +1
  108 + }
  109 +
  110 + c.SummaryResult = rule.SumRewardAmount(rewardNum, faultNum)
  111 +
  112 +}
  113 +
  114 +// SummaryYield 汇总产效数据
  115 +func (c *RewardSummary) SummaryYield(yield float64, rewardStandard *RewardStandard) {
  116 + c.Yield = yield
  117 + if rewardStandard == nil {
  118 + c.YieldResult = 0
  119 + } else {
  120 + r := rewardStandard.VerdictTargetType1(c.Yield)
  121 + c.YieldResult = r
  122 + }
  123 +}
  124 +
  125 +// SummaryUpToStandard 汇总合格率数据
  126 +func (c *RewardSummary) SummaryUpToStandard(param float64, rewardStandard *RewardStandard) {
  127 + c.UpToStandard = param
  128 + if rewardStandard == nil {
  129 + c.UpToStandard = 0
  130 + } else {
  131 + r := rewardStandard.VerdictTargetType2(c.Yield)
  132 + c.UpToStandardResult = r
  133 + }
  134 +}
@@ -39,6 +39,13 @@ type Workshop struct { @@ -39,6 +39,13 @@ type Workshop struct {
39 Ext *Ext `json:"ext,omitempty"` 39 Ext *Ext `json:"ext,omitempty"`
40 } 40 }
41 41
  42 +type SimpleWorkshop struct {
  43 + // 车间ID
  44 + WorkshopId int `json:"workshopId"`
  45 + // 车间名称
  46 + WorkshopName string `json:"workshopName"`
  47 +}
  48 +
42 type WorkshopRepository interface { 49 type WorkshopRepository interface {
43 Save(workshop *Workshop) (*Workshop, error) 50 Save(workshop *Workshop) (*Workshop, error)
44 Remove(workshop *Workshop) (*Workshop, error) 51 Remove(workshop *Workshop) (*Workshop, error)
@@ -301,3 +308,11 @@ func (workshop *Workshop) CloneSample() *Workshop { @@ -301,3 +308,11 @@ func (workshop *Workshop) CloneSample() *Workshop {
301 WorkshopName: workshop.WorkshopName, 308 WorkshopName: workshop.WorkshopName,
302 } 309 }
303 } 310 }
  311 +
  312 +//SimpleWorkshop 输出简化的模型
  313 +func (workShop *Workshop) SimpleWorkshop() SimpleWorkshop {
  314 + return SimpleWorkshop{
  315 + WorkshopId: workShop.WorkshopId,
  316 + WorkshopName: workShop.WorkshopName,
  317 + }
  318 +}
  1 +package dao
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/go-pg/pg/v10"
  7 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  8 +)
  9 +
  10 +//车间看板(生产)的展示数据
  11 +
  12 +type BoardShowDao struct {
  13 + transactionContext *pgTransaction.TransactionContext
  14 +}
  15 +
  16 +func NewBoardShowDao(transactionContext *pgTransaction.TransactionContext) (*BoardShowDao, error) {
  17 + if transactionContext == nil {
  18 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  19 + } else {
  20 + return &BoardShowDao{
  21 + transactionContext: transactionContext,
  22 + }, nil
  23 + }
  24 +}
  25 +
  26 +type BoardWorkshopDesc struct {
  27 + WorkshopName string `json:"workshopName"`
  28 + Uname string `json:"uname"`
  29 + Lines string `json:"lines"`
  30 + Workon string `json:"workon"`
  31 +}
  32 +
  33 +// WorkshopDesc 车间描述
  34 +func (d *BoardShowDao) WorkshopDesc(companyId int, orgId int, workshopId int) (*BoardWorkshopDesc, error) {
  35 + sqlStr := `with workshop as (
  36 + select a.workshop_name,a.uname,a.line->>'lineName' linename from (
  37 + select workshop_name,principal->>'userName' uname
  38 + , jsonb_array_elements(product_lines) line
  39 + from manufacture.workshop where company_id = ?
  40 + and org_id = ?
  41 + and workshop_id=?
  42 + ) a
  43 + where a.line->>'removed' = '1'
  44 + )
  45 + select max(workshop_name) workshop_name
  46 + ,max(uname) uname
  47 + ,string_agg(linename, '\') lines,
  48 + '全天' workon
  49 + from workshop`
  50 + tx := d.transactionContext.PgTx
  51 + var result BoardWorkshopDesc
  52 + _, err := tx.QueryOne(&result, sqlStr, companyId, orgId, workshopId)
  53 + if err != nil {
  54 + return nil, err
  55 + }
  56 + return &result, nil
  57 +}
  58 +
  59 +// 在岗人数
  60 +func (d *BoardShowDao) OnDutyCount(companyId int, orgId int, workshopId int) (int, error) {
  61 + sqlStr := `select count(distinct product_worker->>'userId') from manufacture.product_attendance_record
  62 + where company_id = ?
  63 + and org_id = ?
  64 + and work_station->>'workshopId'='?'
  65 + and sign_in>to_date(to_char(now(), 'YYYY-MM-DD'),'YYYY-MM-DD')`
  66 + var cnt int
  67 + tx := d.transactionContext.PgTx
  68 + _, err := tx.QueryOne(pg.Scan(&cnt), sqlStr, companyId, orgId, workshopId)
  69 + return cnt, err
  70 +}
  71 +
  72 +// 员工效率排名
  73 +type BoardEmployeeWorkpieceRatio struct {
  74 + Uname string `json:"uname"`
  75 + Today string `json:"today"`
  76 + Yesterday string `json:"yesterday"`
  77 + History string `json:"history"`
  78 +}
  79 +
  80 +// 员工效率排名
  81 +func (d *BoardShowDao) EmployeeWorkpieceRatio(companyId int, orgId int, workshopId int) (
  82 + []BoardEmployeeWorkpieceRatio, error) {
  83 + sqlStr := `with employee_plan_product as(
  84 + select product_worker->>'userName' as uname,
  85 + (product_weigh - second_level_weigh - CAST(product_record_info->>'totalOtherSecondLevelWeigh' as decimal)) today
  86 + ,CAST(product_record_info->>'yesterdayOutputWeight' as decimal) yesterday
  87 + ,CAST(product_record_info->>'bestOutputWeight' as decimal) history
  88 + from manufacture.employee_product_record
  89 + where
  90 + company_id = ?
  91 + and org_id = ?
  92 + and work_station->>'workshopId'='?'
  93 + and work_station->>'sectionName' = '包装'
  94 + and product_record_info->>'productDate'=to_char(now(), 'YYYY-MM-DD')
  95 + ),group_employee_plan_product as (
  96 + select uname,sum(today) today,sum(yesterday) yesterday,sum(history) history from employee_plan_product
  97 + group by uname
  98 + )
  99 + select * from group_employee_plan_product
  100 + order by today desc`
  101 + result := make([]BoardEmployeeWorkpieceRatio, 0)
  102 + tx := d.transactionContext.PgTx
  103 + _, err := tx.Query(&result, sqlStr, companyId, orgId, workshopId)
  104 + if err != nil {
  105 + return nil, err
  106 + }
  107 + return result, nil
  108 +}
  109 +
  110 +// 时段产能
  111 +type BoardTimeSectionProductRecord struct {
  112 + Ts string `json:"ts"`
  113 + Total string `json:"total"`
  114 + Line string `json:"line"`
  115 +}
  116 +
  117 +// TimeSectionProductRecord 时段产能
  118 +func (d *BoardShowDao) TimeSectionProductRecord(companyId int, orgId int, workshopId int, lineIdA int, lineIdB int) (
  119 + []BoardTimeSectionProductRecord, error,
  120 +) {
  121 + sqlStr := `(WITH ts_product as(
  122 + select sum(a.weight) total,a.ts,max(line) line from (
  123 + select
  124 + cast(device_running_record_info->>'count' as DECIMAL) weight,
  125 + "replace"(to_char(created_at at time ZONE 'Asia/shanghai', 'HH24:') || cast(date_part('minute',created_at) as integer)/30*30, ':0', ':00') ts,
  126 + work_station->>'lineName' line
  127 + from manufacture.device_running_record
  128 + where
  129 + company_id = ?
  130 + and org_id = ?
  131 + and work_station->>'workshopId'='?'
  132 + and work_station->>'lineId' = '?'
  133 + and device_running_record_info->>'deviceType'='CCJ'
  134 + and created_at >to_date(to_char(now(), 'YYYY-MM-DD'),'YYYY-MM-DD')
  135 + ) a
  136 + group by a.ts
  137 + order by ts
  138 + )
  139 + , ts_product_list as (
  140 + select d.ts,ts_product.total,line from (
  141 + select to_char(c.ts::timestamp,'HH24:MI') ts from (
  142 + select generate_series(a.end - interval '2.5 hour',
  143 + "replace"(to_char(a.end, 'yyyy-mm-dd HH24:') || cast(date_part('minute',a.end) as integer)/30*30+30, ':0', ':00')::timestamp,
  144 + '30 minute') ts from (
  145 + select to_timestamp(to_char(now() at time ZONE 'Asia/shanghai','yyyy-mm-dd HH24'),'yyyy-mm-dd HH24') as end
  146 + ) a
  147 + ) c
  148 + ) d left join ts_product on d.ts = ts_product.ts
  149 + )
  150 + SELECT ts, coalesce(total,0) total ,'南瓜饼1线' line
  151 + from ts_product_list
  152 + )
  153 + union all
  154 + (WITH ts_product as(
  155 + select sum(a.weight) total,a.ts,max(line) line from (
  156 + select
  157 + cast(device_running_record_info->>'count' as DECIMAL) weight,
  158 + "replace"(to_char(created_at at time ZONE 'Asia/shanghai', 'HH24:') || cast(date_part('minute',created_at) as integer)/30*30, ':0', ':00') ts,
  159 + work_station->>'lineName' line
  160 + from manufacture.device_running_record
  161 + where
  162 + company_id = ?
  163 + and org_id = ?
  164 + and work_station->>'workshopId'='?'
  165 + and work_station->>'lineId' = '?'
  166 + and device_running_record_info->>'deviceType'='CCJ'
  167 + and created_at >to_date(to_char(now(), 'YYYY-MM-DD'),'YYYY-MM-DD')
  168 + ) a
  169 + group by a.ts
  170 + order by ts
  171 + )
  172 + , ts_product_list as (
  173 + select d.ts,ts_product.total,line from (
  174 + select to_char(c.ts::timestamp,'HH24:MI') ts from (
  175 + select generate_series(a.end - interval '2.5 hour',
  176 + "replace"(to_char(a.end, 'yyyy-mm-dd HH24:') || cast(date_part('minute',a.end) as integer)/30*30+30, ':0', ':00')::timestamp,
  177 + '30 minute') ts from (
  178 + select to_timestamp(to_char(now() at time ZONE 'Asia/shanghai','yyyy-mm-dd HH24'),'yyyy-mm-dd HH24') as end
  179 + ) a
  180 + ) c
  181 + ) d left join ts_product on d.ts = ts_product.ts
  182 + )
  183 + SELECT ts, coalesce(total,0) total ,'南瓜饼2线' line
  184 + from ts_product_list
  185 + )`
  186 + condition := []interface{}{
  187 + companyId, orgId, workshopId, lineIdA,
  188 + companyId, orgId, workshopId, lineIdB,
  189 + }
  190 + result := make([]BoardTimeSectionProductRecord, 0)
  191 + tx := d.transactionContext.PgTx
  192 + _, err := tx.Query(&result, sqlStr, condition...)
  193 + return result, err
  194 +}
  195 +
  196 +// 今日昨日历史最佳
  197 +type BoardTopShow struct {
  198 + Today string `json:"today"`
  199 + Yesterday string `json:"yesterday"`
  200 + History string `json:"history"`
  201 +}
  202 +
  203 +// TopShop 今日昨日历史最佳
  204 +func (d *BoardShowDao) TopShow(companyId int, orgId int, workshopId int) (*BoardTopShow, error) {
  205 + sqlStr := `with today_product as (
  206 + select
  207 + (case when product_record_type=1 then cast(product_record_info->>'weigh' as DECIMAL)
  208 + ELSE -(cast(product_record_info->>'weigh' as DECIMAL))
  209 + END) as weight,
  210 + cast(product_record_info->>'productPlanId' as INTEGER) plan_id
  211 + from manufacture.product_records
  212 + where company_id = ?
  213 + and org_id = ?
  214 + and work_station->>'workshopId'='?'
  215 + and product_record_type in (1,2)
  216 + and created_at>=to_date(to_char(now(), 'YYYY-MM-DD'),'YYYY-MM-DD')
  217 + ) ,tmp_today_product as(
  218 + select
  219 + (select COALESCE(sum(weight),0) weight from today_product) today,
  220 + (select COALESCE(sum(real),0) from manufacture.workshop_plan_completion_record where
  221 + company_id =?
  222 + and org_id =?
  223 + and created_at > CURRENT_DATE -1
  224 + and workshop_id = ?
  225 + limit 1
  226 + ) yesterday,
  227 + (select max(real) from manufacture.workshop_plan_completion_record where workshop_id = ?) history
  228 + )
  229 + select today,
  230 + cast(yesterday as DECIMAL) yesterday,
  231 + (case when today > history then today else history end) history
  232 + from tmp_today_product`
  233 + condition := []interface{}{
  234 + companyId, orgId, workshopId,
  235 + companyId, orgId, workshopId, workshopId,
  236 + }
  237 + var result BoardTopShow
  238 + tx := d.transactionContext.PgTx
  239 + _, err := tx.QueryOne(&result, sqlStr, condition...)
  240 + return &result, err
  241 +}
  242 +
  243 +// 二级品占比
  244 +type BoardProportionOfSecondLevel struct {
  245 + Sname string `json:"sname"` //品名
  246 + Rate string `json:"rate"` //占比
  247 +}
  248 +
  249 +// 二级品占比
  250 +func (d *BoardShowDao) ProportionOfSecondLevel(companyId int, orgId int, workshopId int) (
  251 + []BoardProportionOfSecondLevel, error) {
  252 + sqlStr := `with item_product as (
  253 + select sum(a.weight) item_total,max(sname) sname from (
  254 + select cast(product_record_info->>'weigh' as DECIMAL) weight
  255 + ,work_station->>'sectionName' sname
  256 + ,work_station->>'workStationId' workStationId
  257 + from manufacture.product_records
  258 + where company_id = ?
  259 + and org_id = ?
  260 + and work_station->>'workshopId'='?'
  261 + and product_record_type = 8
  262 + and product_record_info->>'approveStatus'='2'
  263 + and created_at >=to_date(to_char(now(), 'YYYY-MM-DD'),'YYYY-MM-DD')
  264 + and work_station->>'sectionName' in ('制模','成型','穿串','包装')
  265 + ) a
  266 + group by a.workStationId
  267 + )
  268 + ,item_product_rate as(
  269 + select sname,round(item_total/(select sum(item_total) from item_product)*100, 0) as rate from item_product
  270 + )
  271 + select b.sname, coalesce(b.rate,0) rate from item_product_rate b`
  272 + condition := []interface{}{
  273 + companyId, orgId, workshopId,
  274 + }
  275 + result := make([]BoardProportionOfSecondLevel, 0)
  276 + tx := d.transactionContext.PgTx
  277 + _, err := tx.Query(&result, sqlStr, condition...)
  278 + return result, err
  279 +}
  280 +
  281 +// 工段生产信息
  282 +type BoardSectionProductInfo struct {
  283 + Sname string `json:"sname"`
  284 + ProductWeight string `json:"productWeight"`
  285 + SecondLevelWeight string `json:"secondLevelWeight"`
  286 + TotalWeigh string `json:"totalWeigh"`
  287 + Qu string `json:"qu"`
  288 + Sort string `json:"sort"` //排名
  289 +}
  290 +
  291 +// 工段生产信息
  292 +func (d *BoardShowDao) SectionProductInfo(companyId int, orgId int, workshopId int) (
  293 + []BoardSectionProductInfo, error) {
  294 + sqlStr := `with section_product as(
  295 + select
  296 + work_station->>'sectionName' section, --工段
  297 + CAST(product_record_info->>'outputWeight' as decimal) product_weigh, --产出量
  298 + CAST(product_record_info->>'secondLevelWeight' as decimal) second_level_weigh,
  299 + CAST(product_record_info->>'qualificationRate' as decimal) qu
  300 + --二级品
  301 + from manufacture.workshop_product_record
  302 + where company_id = ?
  303 + and org_id = ?
  304 + and work_station->>'workshopId'='?'
  305 + and product_date =to_char(now(), 'YYYY-MM-DD')
  306 + ),
  307 + all_section_product as(
  308 + select b.sname,
  309 + COALESCE(a.product_weigh,0) product_weigh,
  310 + COALESCE(a.second_level_weigh,0) second_level_weigh,
  311 + COALESCE(a.qu,0) qu
  312 + from section_product a right join (
  313 + select unnest(ARRAY ['制模','成型','穿串','包装']) sname
  314 + ) b on a.section = b.sname
  315 + ),group_section_product as(
  316 + select
  317 + sname,
  318 + sum(product_weigh) product_weigh,
  319 + sum(second_level_weigh) second_level_weigh
  320 + ,sum(product_weigh+second_level_weigh) total_weigh
  321 + from all_section_product
  322 + GROUP BY sname
  323 + )
  324 + select *,
  325 + (case when product_weigh=0 or total_weigh=0 then 0 else round(product_weigh*100/total_weigh,1) end) qu,
  326 + (case when sname = '制模' then 1
  327 + when sname='成型' then 2
  328 + when sname='穿串' then 3 else 4 end) sort
  329 + from group_section_product
  330 + order by sort`
  331 + condition := []interface{}{
  332 + companyId, orgId, workshopId,
  333 + }
  334 + result := make([]BoardSectionProductInfo, 0)
  335 + tx := d.transactionContext.PgTx
  336 + _, err := tx.Query(&result, sqlStr, condition...)
  337 + return result, err
  338 +}
  339 +
  340 +// 当前计划达成率
  341 +func (d *BoardShowDao) WorkshopPlanCompletionCurrent(companyId int, orgId int, workshopId int) (string, error) {
  342 + sqlStr := `select rate rate from manufacture.workshop_plan_completion_record where
  343 + company_id = ?
  344 + and org_id = ?
  345 + and workshop_id=?
  346 + order by created_at desc
  347 + limit 1`
  348 + condition := []interface{}{
  349 + companyId, orgId, workshopId,
  350 + }
  351 + var result string
  352 + tx := d.transactionContext.PgTx
  353 + _, err := tx.QueryOne(pg.Scan(&result), sqlStr, condition...)
  354 + return result, err
  355 +}
  356 +
  357 +type PlanCompletion5Day struct {
  358 + Ts string `jsonL:"ts"`
  359 + Total string `json:"total"`
  360 +}
  361 +
  362 +// 近5天 计划达成率
  363 +func (d *BoardShowDao) WorkshopPlanCompletion5Day(companyId int, orgId int, workshopId int) ([]PlanCompletion5Day, error) {
  364 + sqlStr := `with ts_product as (
  365 + select rate,
  366 + to_char(created_at,'mm-dd') ts
  367 + from manufacture.workshop_plan_completion_record
  368 + where company_id = ?
  369 + and org_id = ?
  370 + and workshop_id= ?
  371 + and created_at > (now()-interval '6d')
  372 + )
  373 + ,ts_product_list as (
  374 + select d.ts,ts_product.rate from (
  375 + select to_char(c.ts::timestamp,'mm-dd') ts from (
  376 + select generate_series(now() - interval '4 day',now(),'1 day') ts
  377 + ) c ) d left join ts_product on d.ts = ts_product.ts
  378 + )
  379 + SELECT ts, coalesce(rate,0) total
  380 + from ts_product_list`
  381 + result := make([]PlanCompletion5Day, 0)
  382 + condition := []interface{}{
  383 + companyId, orgId, workshopId,
  384 + }
  385 + tx := d.transactionContext.PgTx
  386 + _, err := tx.Query(&result, sqlStr, condition...)
  387 + return result, err
  388 +
  389 +}
  390 +
  391 +// product_plan 批次产能
  392 +func (d *BoardShowDao) ProductPlan(companyId int, orgId int, workshopId int) ([]PlanCompletion5Day, error) {
  393 + sqlStr := `with product_record as (
  394 + select
  395 + (case when product_record_type=1 then cast(product_record_info->>'weigh' as DECIMAL)
  396 + ELSE -(cast(product_record_info->>'weigh' as DECIMAL))
  397 + END) as weight,
  398 + cast(product_record_info->>'productPlanId' as INTEGER) plan_id
  399 + from manufacture.product_records
  400 + where company_id =?
  401 + and org_id = ?
  402 + and work_station->>'workshopId'='?'
  403 + and work_station->>'sectionName'='包装'
  404 + and product_record_type in (1,2)
  405 + and created_at>to_date(to_char((now() -interval '3 day'), 'YYYY-MM-DD'),'YYYY-MM-DD') --'2022-01-01' --
  406 + ), product_record_sum as(
  407 + select sum(weight) weight,plan_id
  408 + from product_record
  409 + GROUP BY plan_id
  410 + )
  411 + select
  412 + a.product_plan_id
  413 + ,batch_number --批次号
  414 + ,plan_product_name --品名
  415 + ,machine --机台
  416 + ,coalesce(plan_devoted->>'unit','') unit --规格
  417 + ,cast(coalesce(plan_devoted->>'quantity','0') as DECIMAL) quantity -- 数量
  418 + ,cast(coalesce(plan_devoted->>'weight','0')as DECIMAL) plan_weight -- 计划重量
  419 + , coalesce(b.weight,0) real_weight --批次实际产能
  420 + from manufacture.product_plan a left join product_record_sum b on a.product_plan_id = b.plan_id
  421 + where company_id = ?
  422 + and org_id = ?
  423 + and workshop->>'workshopId'='?'
  424 + and product_date >to_date(to_char(now() -interval '3 day', 'YYYY-MM-DD'),'YYYY-MM-DD')
  425 + and cast(coalesce(plan_devoted->>'weight','0')as DECIMAL) >0
  426 + order by created_at desc`
  427 + result := make([]PlanCompletion5Day, 0)
  428 + condition := []interface{}{
  429 + companyId, orgId, workshopId,
  430 + companyId, orgId, workshopId,
  431 + }
  432 + tx := d.transactionContext.PgTx
  433 + _, err := tx.Query(&result, sqlStr, condition...)
  434 + return result, err
  435 +}
  1 +package dao
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 +)
  8 +
  9 +type RewardSumaryDao struct {
  10 + transactionContext *pgTransaction.TransactionContext
  11 +}
  12 +
  13 +func NewRewardSumaryDao(transactionContext *pgTransaction.TransactionContext) (*RewardSumaryDao, error) {
  14 + if transactionContext == nil {
  15 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  16 + } else {
  17 + return &RewardSumaryDao{
  18 + transactionContext: transactionContext,
  19 + }, nil
  20 + }
  21 +}
  22 +
  23 +// 功过看板-日榜
  24 +type RewardSummaryDay struct {
  25 + Id int `json:"id"` //id
  26 + RecordDateStr string `json:"record_date_str"`
  27 + SectionName string `json:"sectionName"` //工段名称
  28 + WorkerName string `json:"workerName"` //员工名称
  29 + SummaryResult string `json:"summaryResult"` //奖惩结果
  30 + YieldResult string `json:"yieldResult"` //产效功过结果
  31 + UpToStandardResult string `json:"upToStandardResult"` //合格率功过结果
  32 + AccidentResult1 string `json:"accidentResult1"` //质量事故功过结果
  33 + AccidentResult2 string `json:"accidentResul2"` //安全事故功过结果
  34 + AccidentResult3 string `json:"accidentResul3"` //异物 功过结果
  35 +}
  36 +
  37 +// 功过看板-日榜
  38 +func (d *RewardSumaryDao) SeachRewardSummaryDay(companyId int, orgId int, recordDate string) ([]RewardSummaryDay, error) {
  39 + sqlStr := `SELECT
  40 + "id",record_date_str,
  41 + work_station->>'sectionName' as section_name,
  42 + worker->>'userName' as worker_name,
  43 + summary_result,
  44 + yield_result,
  45 + up_to_standard_result,
  46 + accident_result1,
  47 + accident_result2,
  48 + accident_result3
  49 + FROM manufacture."reward_summary"
  50 + WHERE company_id=?
  51 + and org_id=?
  52 + and record_date_str=?`
  53 + tx := d.transactionContext.PgTx
  54 + var result []RewardSummaryDay
  55 + _, err := tx.Query(&result, sqlStr, companyId, orgId, recordDate)
  56 +
  57 + for i := range result {
  58 + switch result[i].AccidentResult1 {
  59 + case "1":
  60 + result[i].AccidentResult1 = "功"
  61 + case "0":
  62 + result[i].AccidentResult1 = "不奖不惩"
  63 + case "-1":
  64 + result[i].AccidentResult1 = "过"
  65 + }
  66 + switch result[i].AccidentResult2 {
  67 + case "1":
  68 + result[i].AccidentResult2 = "功"
  69 + case "0":
  70 + result[i].AccidentResult2 = "不奖不惩"
  71 + case "-1":
  72 + result[i].AccidentResult2 = "过"
  73 + }
  74 + switch result[i].AccidentResult3 {
  75 + case "1":
  76 + result[i].AccidentResult3 = "功"
  77 + case "0":
  78 + result[i].AccidentResult3 = "不奖不惩"
  79 + case "-1":
  80 + result[i].AccidentResult3 = "过"
  81 + }
  82 + switch result[i].UpToStandardResult {
  83 + case "1":
  84 + result[i].UpToStandardResult = "功"
  85 + case "0":
  86 + result[i].UpToStandardResult = "不奖不惩"
  87 + case "-1":
  88 + result[i].UpToStandardResult = "过"
  89 + }
  90 + switch result[i].YieldResult {
  91 + case "1":
  92 + result[i].YieldResult = "功"
  93 + case "0":
  94 + result[i].YieldResult = "不奖不惩"
  95 + case "-1":
  96 + result[i].YieldResult = "过"
  97 + }
  98 + }
  99 + return result, err
  100 +}
  101 +
  102 +// 功过看板-产效
  103 +type RewardSummaryYield struct {
  104 + RecordDateStr string `json:"record_date_str"`
  105 + SectionName string `json:"sectionName"` //工段名称
  106 + WorkerName string `json:"workerName"` //员工名称
  107 + Yield string `json:"yield"` //产效
  108 + YieldResult string `json:"yieldResult"` //产效功过结果
  109 + YieldMax string `json:"yildMax"` //产效历史最佳
  110 +}
  111 +
  112 +// 功过看板-产效
  113 +func (d *RewardSumaryDao) SeachRewardSummaryYield(companyId int, orgId int, recordDate string) ([]RewardSummaryYield, error) {
  114 + // sqlStr := `SELECT
  115 + // record_date_str,
  116 + // work_station->>'sectionName' as section_name,
  117 + // worker->>'userName' as worker_name,
  118 + // yield_result,
  119 + // yield,
  120 + // '24' as yield_max
  121 + // FROM manufacture."reward_summary"
  122 + // WHERE company_id=?
  123 + // and org_id=?
  124 + // and record_date_str=?`
  125 +
  126 + sqlStr := `with
  127 + t1 as( SELECT
  128 + max(yield) as yield_max,
  129 + work_station->>'sectionId' AS section_id,
  130 + worker->>'userId' as worker_id
  131 + FROM manufacture."reward_summary"
  132 + WHERE company_id=? and org_id=?
  133 + GROUP BY section_id,worker_id
  134 + ),
  135 + t2 as (SELECT
  136 + record_date_str,
  137 + work_station->>'sectionId' AS section_id,
  138 + worker->>'userId' as worker_id,
  139 + work_station->>'sectionName' as section_name,
  140 + worker->>'userName' as worker_name,
  141 + yield_result,
  142 + yield
  143 + FROM manufacture."reward_summary"
  144 + WHERE company_id=? and org_id=?
  145 + and record_date_str=?
  146 + )
  147 + SELECT t2.record_date_str,t2.section_name,t2.worker_name,
  148 + t2.yield_result,t2.yield,t1.yield_max
  149 + FROM t2
  150 + JOIN t1 on t2.section_id=t1.section_id AND t2.worker_id=t2.worker_id`
  151 +
  152 + tx := d.transactionContext.PgTx
  153 + var result []RewardSummaryYield
  154 + params := []interface{}{
  155 + companyId, orgId,
  156 + companyId, orgId, recordDate,
  157 + }
  158 + _, err := tx.Query(&result, sqlStr, params...)
  159 + for i := range result {
  160 + switch result[i].YieldResult {
  161 + case "1":
  162 + result[i].YieldResult = "功"
  163 + case "0":
  164 + result[i].YieldResult = "不奖不惩"
  165 + case "-1":
  166 + result[i].YieldResult = "过"
  167 + }
  168 + }
  169 + return result, err
  170 +
  171 +}
  172 +
  173 +// 功过看板-合格率
  174 +type RewardSummaryUpToStandard struct {
  175 + RecordDateStr string `json:"record_date_str"`
  176 + SectionName string `json:"sectionName"` //工段名称
  177 + WorkerName string `json:"workerName"` //员工名称
  178 + UpToStandard string `json:"upToStandard"` //合格率
  179 + UpToStandardResult string `json:"upToStandardResult"` //合格率功过结果
  180 + UpToStandardMax string `json:"upToStandardMax"` //合格率历史最佳
  181 +}
  182 +
  183 +// 功过看板-合格率
  184 +func (d *RewardSumaryDao) SeachRewardUpToStandard(companyId int, orgId int, recordDate string) ([]RewardSummaryUpToStandard, error) {
  185 + // sqlStr := `SELECT
  186 + // record_date_str,
  187 + // work_station->>'sectionName' as section_name,
  188 + // worker->>'userName' as worker_name,
  189 + // up_to_standard_result,
  190 + // up_to_standard,
  191 + // '90' as up_to_standard_max
  192 + // FROM manufacture."reward_summary"
  193 + // WHERE company_id=23
  194 + // and org_id=487
  195 + // and record_date_str='2022-10-29'`
  196 + sqlStr := `with
  197 + t1 as( SELECT
  198 + max(up_to_standard) as up_to_standard_max,
  199 + work_station->>'sectionId' AS section_id,
  200 + worker->>'userId' as worker_id
  201 + FROM manufacture."reward_summary"
  202 + WHERE company_id=? and org_id=?
  203 + GROUP BY section_id,worker_id
  204 + ),
  205 + t2 as (SELECT
  206 + record_date_str,
  207 + work_station->>'sectionId' AS section_id,
  208 + worker->>'userId' as worker_id,
  209 + work_station->>'sectionName' as section_name,
  210 + worker->>'userName' as worker_name,
  211 + up_to_standard_result,
  212 + up_to_standard
  213 + FROM manufacture."reward_summary"
  214 + WHERE company_id=? and org_id=?
  215 + and record_date_str=?
  216 + )
  217 + SELECT t2.record_date_str,t2.section_name,t2.worker_name,
  218 + t2.up_to_standard_result,t2.up_to_standard,t1.up_to_standard_max
  219 + FROM t2
  220 + JOIN t1 on t2.section_id=t1.section_id AND t2.worker_id=t2.worker_id`
  221 + tx := d.transactionContext.PgTx
  222 + var result []RewardSummaryUpToStandard
  223 + params := []interface{}{
  224 + companyId, orgId,
  225 + companyId, orgId, recordDate,
  226 + }
  227 + _, err := tx.Query(&result, sqlStr, params...)
  228 + for i := range result {
  229 + switch result[i].UpToStandardResult {
  230 + case "1":
  231 + result[i].UpToStandardResult = "功"
  232 + case "0":
  233 + result[i].UpToStandardResult = "不奖不惩"
  234 + case "-1":
  235 + result[i].UpToStandardResult = "过"
  236 + }
  237 + }
  238 + return result, err
  239 +}
  240 +
  241 +// 功过看板-异常
  242 +type RewardAccident struct {
  243 + Id string `json:"id"`
  244 + RecordDateStr string `json:"record_date_str"`
  245 + SectionName string `json:"sectionName"` //工段名称
  246 + WorkerName string `json:"workerName"` //员工名称
  247 + AccidentAmount1 string `json:"accidentAmount1"` //质量事故损失金额
  248 + AccidentNum1 string `json:"accidentNum1"` //质量事故次数
  249 + AccidentResult1 string `json:"accidentResult1"` //质量事故功过结果
  250 + AccidentAmount2 string `json:"accidentAmount2"` //安全事故 损失金额
  251 + AccidentResult2 string `json:"accidentResul2"` //安全事故功过结果
  252 + AccidentNum2 string `json:"accidentNum2"` //安全事故 次数
  253 + AccidentNum3 string `json:"accidentNum3"` //金属异物 次数
  254 + AccidentNum4 string `json:"accidentNum4"` //非属异物事故次数
  255 + AccidentResult3 string `json:"accidentResul3"` //异物 功过结果
  256 +}
  257 +
  258 +// 功过看板-异常
  259 +func (d *RewardSumaryDao) SeachRewardAccident(companyId int, orgId int, recordDate string) ([]RewardAccident, error) {
  260 + sqlStr := `SELECT
  261 + "id",record_date_str,
  262 + work_station->>'sectionName' as section_name,
  263 + worker->>'userName' as worker_name,
  264 + accident_num1,accident_amount1,accident_result1,
  265 + accident_num2,accident_amount2,accident_result2,
  266 + accident_num3,accident_num4,accident_result3
  267 + FROM manufacture."reward_summary"
  268 + WHERE company_id=?
  269 + and org_id=?
  270 + and record_date_str=?`
  271 + tx := d.transactionContext.PgTx
  272 + var result []RewardAccident
  273 + _, err := tx.Query(&result, sqlStr, companyId, orgId, recordDate)
  274 +
  275 + for i := range result {
  276 + switch result[i].AccidentResult1 {
  277 + case "1":
  278 + result[i].AccidentResult1 = "功"
  279 + case "0":
  280 + result[i].AccidentResult1 = "不奖不惩"
  281 + case "-1":
  282 + result[i].AccidentResult1 = "过"
  283 + }
  284 + switch result[i].AccidentResult2 {
  285 + case "1":
  286 + result[i].AccidentResult2 = "功"
  287 + case "0":
  288 + result[i].AccidentResult2 = "不奖不惩"
  289 + case "-1":
  290 + result[i].AccidentResult2 = "过"
  291 + }
  292 + switch result[i].AccidentResult3 {
  293 + case "1":
  294 + result[i].AccidentResult3 = "功"
  295 + case "0":
  296 + result[i].AccidentResult3 = "不奖不惩"
  297 + case "-1":
  298 + result[i].AccidentResult3 = "过"
  299 + }
  300 + }
  301 + return result, err
  302 +}
  303 +
  304 +// 功过看板-月榜
  305 +type RewardSummaryMonth struct {
  306 + SectionId string `json:"sectionId"` //工段名称
  307 + SectionName string `json:"sectionName"` //工段名称
  308 + WorkerName string `json:"workerName"` //员工名称
  309 + WorkerId string `json:"workerId"` //员工名称
  310 + AccidentAmount1 string `json:"accidentAmount1"` //质量事故损失金额
  311 + AccidentNum1 string `json:"accidentNum1"` //质量事故次数
  312 + AccidentNum3 string `json:"accidentNum3"` //金属异物事故 次数
  313 + AccidentNum4 string `json:"accidentNum4"` //非属异物事故 次数
  314 + AccidentAmount2 string `json:"accidentAmount2"` //安全事故 损失金额
  315 + AccidentNum2 string `json:"accidentNum2"` //安全事故 次数
  316 + YieldAvg string `json:"yieldAvg"` //平均产效
  317 + YieldMax string `json:"yieldMax"` //产效历史最佳
  318 + UpToStandard string `json:"upToStandard"` //合格率
  319 + AmountFine string `json:"amountFine"` //惩,的金额
  320 + AmountReward string `json:"amountReward"` //奖,的金额
  321 + AmountFinal string `json:"amountFinal"` //最终的 奖惩结果
  322 +}
  323 +
  324 +// 功过看板-月榜
  325 +func (d *RewardSumaryDao) SeachRewardSummaryMonth(companyId int, orgId int, recordMonth string) ([]RewardSummaryMonth, error) {
  326 + sqlStr := `
  327 + SELECT
  328 + work_station->>'sectionId' AS section_id,
  329 + work_station->>'sectionName' as section_name,
  330 + worker->>'userId' as worker_id,
  331 + worker->>'userName' as worker_name,
  332 + sum(accident_num1) as accident_num1,
  333 + sum(accident_num2) as accident_num2,
  334 + sum(accident_num3) as accident_num3,
  335 + sum(accident_num4) as accident_num4,
  336 + sum(accident_amount1) as accident_amount1,
  337 + sum(accident_amount2) as accident_amount2,
  338 + CAST(sum(summary_result) as decimal(10,2)) as amount_final,
  339 + CAST(
  340 + sum(CASE WHEN summary_result<0 THEN summary_result ELSE 0 END) as decimal(10,2)
  341 + ) as amount_fine,
  342 + CAST(
  343 + sum(CASE WHEN summary_result>0 THEN summary_result ELSE 0 END) as decimal(10,2)
  344 + ) as amount_reward,
  345 + max(yield) as yield_max,
  346 + CAST(avg(yield) as decimal(10,2)) as yield_avg,
  347 + CAST(avg(up_to_standard) as decimal(10,2) ) as up_to_standard
  348 + FROM manufacture.reward_summary
  349 + WHERE company_id=?
  350 + and org_id=?
  351 + and record_month_str=?
  352 + GROUP BY section_id,worker_id,worker_name,section_name
  353 + ;
  354 + `
  355 + tx := d.transactionContext.PgTx
  356 + var result []RewardSummaryMonth
  357 + _, err := tx.Query(&result, sqlStr, companyId, orgId, recordMonth)
  358 + return result, err
  359 +}
@@ -3,13 +3,14 @@ package domainService @@ -3,13 +3,14 @@ package domainService
3 import ( 3 import (
4 "errors" 4 "errors"
5 "fmt" 5 "fmt"
  6 + "time"
  7 +
6 "github.com/linmadan/egglib-go/core/application" 8 "github.com/linmadan/egglib-go/core/application"
7 pgTransaction "github.com/linmadan/egglib-go/transaction/pg" 9 pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
12 - "time"  
13 ) 14 )
14 15
15 type PGProductRecordService struct { 16 type PGProductRecordService struct {
@@ -37,10 +38,12 @@ type SubmitOptions struct { @@ -37,10 +38,12 @@ type SubmitOptions struct {
37 UnitConversionId int `cname:"物料ID" json:"unitConversionId"` 38 UnitConversionId int `cname:"物料ID" json:"unitConversionId"`
38 // 重量 39 // 重量
39 Weigh float64 `cname:"重量" json:"weigh" valid:"Required"` 40 Weigh float64 `cname:"重量" json:"weigh" valid:"Required"`
  41 + //日期
  42 + CreatedAt time.Time `cname:"日期" json:"createdAt" `
40 } 43 }
41 44
42 // SubmitProductRecord 提交生产记录 45 // SubmitProductRecord 提交生产记录
43 -func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, queryOptions map[string]interface{}) (interface{}, error) { 46 +func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, queryOptions map[string]interface{}) (*domain.ProductRecord, error) {
44 var request = &SubmitOptions{} 47 var request = &SubmitOptions{}
45 if err := utils.LoadQueryObject(queryOptions, request); err != nil { 48 if err := utils.LoadQueryObject(queryOptions, request); err != nil {
46 return nil, err 49 return nil, err
@@ -127,6 +130,12 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu @@ -127,6 +130,12 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu
127 }, 130 },
128 Ext: domain.NewExt(org.OrgName), 131 Ext: domain.NewExt(org.OrgName),
129 } 132 }
  133 +
  134 + if !request.CreatedAt.IsZero() {
  135 + //管理页面上手动添加记录时,有填写日期
  136 + record.CreatedAt = request.CreatedAt
  137 + }
  138 +
130 if record, err = productRecordRepository.Save(record); err != nil { 139 if record, err = productRecordRepository.Save(record); err != nil {
131 return nil, err 140 return nil, err
132 } 141 }
@@ -147,7 +156,7 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu @@ -147,7 +156,7 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu
147 // return nil, err 156 // return nil, err
148 // } 157 // }
149 //} 158 //}
150 - return nil, nil 159 + return record, nil
151 } 160 }
152 161
153 // Approve 审核生产记录 (二级品审核) 162 // Approve 审核生产记录 (二级品审核)
@@ -2,12 +2,13 @@ package domainService @@ -2,12 +2,13 @@ package domainService
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "time"
  6 +
5 "github.com/mohae/deepcopy" 7 "github.com/mohae/deepcopy"
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
10 - "time"  
11 ) 12 )
12 13
13 const ( 14 const (
@@ -21,7 +22,7 @@ const ( @@ -21,7 +22,7 @@ const (
21 DefaultCCJUnitQuantity = 0.2 //kg 穿串机默认的换算数量 1串/0.1千克 22 DefaultCCJUnitQuantity = 0.2 //kg 穿串机默认的换算数量 1串/0.1千克
22 ) 23 )
23 24
24 -//EmployeeProductStatics 员工产能统计 25 +// EmployeeProductStatics 员工产能统计
25 func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain.ProductRecord) (interface{}, error) { 26 func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain.ProductRecord) (interface{}, error) {
26 27
27 var ( 28 var (
@@ -249,10 +250,18 @@ func (ptr *PGProductRecordService) personalProductStatics(productPlan *domain.Pr @@ -249,10 +250,18 @@ func (ptr *PGProductRecordService) personalProductStatics(productPlan *domain.Pr
249 if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { 250 if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil {
250 log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, productRecord.ProductWorker.UserId, err.Error())) 251 log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, productRecord.ProductWorker.UserId, err.Error()))
251 } 252 }
  253 +
  254 + //TODO 记录奖惩明细
  255 +
  256 + rewardSummarySrv, _ := NewPGRewardSummaryStaticService(ptr.transactionContext)
  257 + err = rewardSummarySrv.CreateRewardSummaryByEmployeeProductRecord(employeeProductRecord)
  258 + if err != nil {
  259 + log.Logger.Error(fmt.Sprintf("记录奖惩明细,生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, productRecord.ProductWorker.UserId, err.Error()))
  260 + }
252 return nil, nil 261 return nil, nil
253 } 262 }
254 263
255 -//WorkshopProductStatics 车间产能统计 264 +// WorkshopProductStatics 车间产能统计
256 func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord) (interface{}, error) { 265 func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord) (interface{}, error) {
257 var ( 266 var (
258 workshopRepository, _ = repository.NewWorkshopRepository(ptr.transactionContext) 267 workshopRepository, _ = repository.NewWorkshopRepository(ptr.transactionContext)
  1 +package domainService
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "github.com/linmadan/egglib-go/core/application"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
  11 +)
  12 +
  13 +//功过奖惩明细汇总
  14 +
  15 +type PGRewardSummaryStaticService struct {
  16 + transactionContext *pgTransaction.TransactionContext
  17 +}
  18 +
  19 +func NewPGRewardSummaryStaticService(transactionContext *pgTransaction.TransactionContext) (*PGRewardSummaryStaticService, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + } else {
  23 + return &PGRewardSummaryStaticService{
  24 + transactionContext: transactionContext,
  25 + }, nil
  26 + }
  27 +}
  28 +
  29 +// 根据事故数据
  30 +func (c *PGRewardSummaryStaticService) CreateRewardSummaryByProductTrouble(param *domain.ProductTrouble) error {
  31 + rewardSummaryRepo, _ := repository.NewRewardSummaryRepository(c.transactionContext)
  32 + //查询是否已经有汇总数据
  33 + condtion := map[string]interface{}{
  34 + "orgId": param.OrgId,
  35 + "companyId": param.CompanyId,
  36 + "lineId": param.WorkStation.LineId,
  37 + "sectionId": param.WorkStation.SectionId,
  38 + "workshopId": param.WorkStation.WorkshopId,
  39 + "workerId": param.ProductWorker.UserId,
  40 + "recordDateStr": param.RecordDate.Format("200-01-02"),
  41 + }
  42 +
  43 + _, summaryList, err := rewardSummaryRepo.Find(condtion)
  44 + if err != nil {
  45 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  46 + }
  47 +
  48 + var summaryData *domain.RewardSummary
  49 + nowTime := time.Now()
  50 + if len(summaryList) > 0 {
  51 + summaryData = summaryList[0]
  52 + } else {
  53 + summaryData = &domain.RewardSummary{
  54 + Id: 0,
  55 + CompanyId: param.CompanyId,
  56 + OrgId: param.OrgId,
  57 + WorkStation: param.WorkStation,
  58 + Worker: param.ProductWorker,
  59 + RecordDate: param.RecordDate,
  60 + RecordDateStr: param.RecordDate.Format("2006-01-02"),
  61 + UpToStandard: 0.0,
  62 + Yield: 0.0,
  63 + AccidentNum1: 0,
  64 + AccidentAmount1: 0.0,
  65 + AccidentNum2: 0,
  66 + AccidentAmount2: 0.0,
  67 + AccidentNum3: 0,
  68 + AccidentNum4: 0,
  69 + SummaryResult: 0.0,
  70 + CreatedAt: nowTime,
  71 + UpdatedAt: nowTime,
  72 + }
  73 + }
  74 +
  75 + var targetType int
  76 + switch param.Types {
  77 + case domain.TroubleType1:
  78 + targetType = domain.TargetType3
  79 + case domain.TroubleType2:
  80 + targetType = domain.TargetType4
  81 + case domain.TroubleType3:
  82 + targetType = domain.TargetType5
  83 + case domain.TroubleType4:
  84 + targetType = domain.TargetType5
  85 + }
  86 + //获取奖惩标准 按 车间 线别 工段 类型
  87 + rewardStandardRepo, _ := repository.NewRewardStandardRepository(c.transactionContext)
  88 + _, rewardStandardList, err := rewardStandardRepo.Find(map[string]interface{}{
  89 + "companyId": param.CompanyId,
  90 + "orgId": param.OrgId,
  91 + "workshopId": param.WorkStation.WorkshopId,
  92 + "lineId": param.WorkStation.LineId,
  93 + "sectionId": param.WorkStation.SectionId,
  94 + "targetType": targetType,
  95 + "limit": 1,
  96 + })
  97 + if err != nil {
  98 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  99 + }
  100 + if len(rewardStandardList) > 0 {
  101 + summaryData.SummaryAccident(param, rewardStandardList[0])
  102 + } else {
  103 + summaryData.SummaryAccident(param, nil)
  104 + }
  105 +
  106 + //获取奖惩规则
  107 + rewardRuleRepo, _ := repository.NewRewardRuleRepository(c.transactionContext)
  108 + _, rewardRuleList, err := rewardRuleRepo.Find(map[string]interface{}{
  109 + "companyId": param.CompanyId,
  110 + "orgId": param.OrgId,
  111 + })
  112 + if err != nil {
  113 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取奖惩规则"+err.Error())
  114 + }
  115 + if len(rewardRuleList) >= 0 {
  116 + summaryData.ApplySummaryResult(rewardRuleList[0])
  117 + }
  118 + summaryData.UpdatedAt = nowTime
  119 + _, err = rewardSummaryRepo.Save(summaryData)
  120 + if err != nil {
  121 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  122 + }
  123 + return nil
  124 +}
  125 +
  126 +// CreateRewardSummaryByEmployeeProductRecord 通过员工生产记录 汇总奖惩结果
  127 +func (c *PGRewardSummaryStaticService) CreateRewardSummaryByEmployeeProductRecord(param *domain.EmployeeProductRecord) error {
  128 + rewardSummaryRepo, _ := repository.NewRewardSummaryRepository(c.transactionContext)
  129 + //查询是否已经有汇总数据
  130 + condtion := map[string]interface{}{
  131 + "orgId": param.OrgId,
  132 + "companyId": param.CompanyId,
  133 + "lineId": param.WorkStation.LineId,
  134 + "sectionId": param.WorkStation.SectionId,
  135 + "workshopId": param.WorkStation.WorkshopId,
  136 + "workerId": param.ProductWorker.UserId,
  137 + "recordDateStr": param.CreatedAt.Format("2006-01-02"),
  138 + }
  139 +
  140 + _, summaryList, err := rewardSummaryRepo.Find(condtion)
  141 + if err != nil {
  142 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  143 + }
  144 +
  145 + var summaryData *domain.RewardSummary
  146 + nowTime := time.Now()
  147 + if len(summaryList) > 0 {
  148 + summaryData = summaryList[0]
  149 + } else {
  150 + summaryData = &domain.RewardSummary{
  151 + Id: 0,
  152 + CompanyId: param.CompanyId,
  153 + OrgId: param.OrgId,
  154 + // WorkStation: *param.WorkStation,
  155 + // Worker: *param.ProductWorker,
  156 + RecordDate: param.CreatedAt,
  157 + RecordDateStr: param.CreatedAt.Format("2006-01-02"),
  158 + UpToStandard: 0.0,
  159 + Yield: 0.0,
  160 + AccidentNum1: 0,
  161 + AccidentAmount1: 0.0,
  162 + AccidentNum2: 0,
  163 + AccidentAmount2: 0.0,
  164 + AccidentNum3: 0,
  165 + AccidentNum4: 0,
  166 + SummaryResult: 0.0,
  167 + CreatedAt: nowTime,
  168 + UpdatedAt: nowTime,
  169 + }
  170 + if param.WorkStation != nil {
  171 + summaryData.WorkStation = *param.WorkStation
  172 + }
  173 + if param.ProductWorker != nil {
  174 + summaryData.Worker = *param.ProductWorker
  175 + }
  176 + }
  177 + //获取奖惩标准 按 车间 线别 工段 类型 ;合格率类型
  178 + rewardStandardRepo, _ := repository.NewRewardStandardRepository(c.transactionContext)
  179 + _, rewardStandardList, err := rewardStandardRepo.Find(map[string]interface{}{
  180 + "companyId": param.CompanyId,
  181 + "orgId": param.OrgId,
  182 + "workshopId": param.WorkStation.WorkshopId,
  183 + "lineId": param.WorkStation.LineId,
  184 + "sectionId": param.WorkStation.SectionId,
  185 + "targetType": domain.TargetType2,
  186 + "limit": 1,
  187 + })
  188 + if err != nil {
  189 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  190 + }
  191 + if len(rewardStandardList) > 0 {
  192 + //汇总合格率
  193 + summaryData.SummaryUpToStandard(param.ProductRecordInfo.QualificationRate, rewardStandardList[0])
  194 + } else {
  195 + summaryData.SummaryUpToStandard(param.ProductRecordInfo.QualificationRate, nil)
  196 + }
  197 +
  198 + //获取奖惩标准 按 车间 线别 工段 类型 ;产能类型
  199 + _, rewardStandardList, err = rewardStandardRepo.Find(map[string]interface{}{
  200 + "companyId": param.CompanyId,
  201 + "orgId": param.OrgId,
  202 + "workshopId": param.WorkStation.WorkshopId,
  203 + "lineId": param.WorkStation.LineId,
  204 + "sectionId": param.WorkStation.SectionId,
  205 + "targetType": domain.TargetType1,
  206 + "limit": 1,
  207 + })
  208 + if err != nil {
  209 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  210 + }
  211 + if len(rewardStandardList) > 0 {
  212 + //汇总合格率
  213 + summaryData.SummaryYield(param.ProductRecordInfo.OutputWeight, rewardStandardList[0])
  214 + } else {
  215 + summaryData.SummaryYield(param.ProductRecordInfo.OutputWeight, nil)
  216 + }
  217 + //根据规则算 奖惩金额
  218 + //获取奖惩规则
  219 + rewardRuleRepo, _ := repository.NewRewardRuleRepository(c.transactionContext)
  220 + _, rewardRuleList, err := rewardRuleRepo.Find(map[string]interface{}{
  221 + "companyId": param.CompanyId,
  222 + "orgId": param.OrgId,
  223 + })
  224 + if err != nil {
  225 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取奖惩规则"+err.Error())
  226 + }
  227 + if len(rewardRuleList) >= 0 {
  228 + summaryData.ApplySummaryResult(rewardRuleList[0])
  229 + }
  230 + summaryData.UpdatedAt = nowTime
  231 + _, err = rewardSummaryRepo.Save(summaryData)
  232 + if err != nil {
  233 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  234 + }
  235 + return nil
  236 +}
@@ -3,10 +3,11 @@ package pg @@ -3,10 +3,11 @@ package pg
3 import ( 3 import (
4 "context" 4 "context"
5 "fmt" 5 "fmt"
6 - "github.com/beego/beego/v2/core/logs"  
7 "log" 6 "log"
8 "reflect" 7 "reflect"
9 8
  9 + "github.com/beego/beego/v2/core/logs"
  10 +
10 "github.com/go-pg/pg/v10" 11 "github.com/go-pg/pg/v10"
11 "github.com/go-pg/pg/v10/orm" 12 "github.com/go-pg/pg/v10/orm"
12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
@@ -50,6 +51,10 @@ func init() { @@ -50,6 +51,10 @@ func init() {
50 (*models.WorkshopPlanCompletionRecord)(nil), 51 (*models.WorkshopPlanCompletionRecord)(nil),
51 (*models.ProductMaterialGroup)(nil), 52 (*models.ProductMaterialGroup)(nil),
52 (*models.ProductMaterial)(nil), 53 (*models.ProductMaterial)(nil),
  54 + (*models.RewardStandard)(nil),
  55 + (*models.RewardRule)(nil),
  56 + (*models.ProductTrouble)(nil),
  57 + (*models.RewardSummary)(nil),
53 } { 58 } {
54 err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ 59 err := DB.Model(model).CreateTable(&orm.CreateTableOptions{
55 Temp: false, 60 Temp: false,
1 package models 1 package models
2 2
3 import ( 3 import (
4 - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"  
5 "time" 4 "time"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
6 ) 7 )
7 8
8 type EmployeeProductRecord struct { 9 type EmployeeProductRecord struct {
  1 +package models
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 +)
  8 +
  9 +// 事故管理数据结构
  10 +type ProductTrouble struct {
  11 + tableName string `comment:" 事故管理" pg:"manufacture.product_trouble,alias:product_trouble"`
  12 + Id int ` pg:"pk:id"` // id
  13 + CompanyId int //企业id
  14 + OrgId int //组织ID
  15 + WorkStation domain.WorkStation // 工作位置
  16 + ProductWorker domain.User // 生产工人
  17 + AmountLoss float64 // 损失的金额
  18 + Types string // 事故类型
  19 + RecordDate time.Time // 事故发生的日期
  20 + Remark string // 备注
  21 + ApproveStatus int // 审核状态 1:未审核 2:已审核 3.自动审核
  22 + ApproveAt *time.Time // 审核时间
  23 + ApproveUser *domain.User // 审核人
  24 + CreatedAt time.Time // 创建时间
  25 + UpdatedAt time.Time // 更新时间
  26 + DeletedAt *time.Time // 删除时间
  27 +}
  1 +package models
  2 +
  3 +import (
  4 + "time"
  5 +)
  6 +
  7 +//RewardRule 奖惩规则
  8 +type RewardRule struct {
  9 + tableName string `pg:"manufacture.reward_rule,alias:reward_rule"`
  10 + Id int `pg:"pk:id"` //奖惩标准 id
  11 + CompanyId int `comment:"企业id"` // 企业id
  12 + OrgId int `comment:"组织ID"` // 组织ID
  13 + RewardTag string
  14 + RewardNum int
  15 + RewardAmount string
  16 + FaultTag string
  17 + FaultNum int
  18 + FaultAmount string
  19 + Remark string
  20 + CreatedAt time.Time
  21 + UpdatedAt time.Time
  22 +}
  1 +package models
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 +)
  8 +
  9 +//RewardStandard 奖惩标准
  10 +type RewardStandard struct {
  11 + tableName string `pg:"manufacture.reward_standard,alias:reward_standard"`
  12 + Id int `pg:"pk:id"` //奖惩标准 id
  13 + CompanyId int `comment:"企业id"` // 企业id
  14 + OrgId int `comment:"组织ID"` // 组织ID
  15 + Workshop domain.SimpleWorkshop //车间
  16 + ProductLine domain.SimpleProductLine //生产线
  17 + ProductSection domain.ProductSection //工段
  18 + Remark string //备注
  19 + TargetType int //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
  20 + TargeVal1 string //填写的指标值1
  21 + TargeVal2 string //填写的指标值2
  22 + TargeVal3 string //填写的指标值3
  23 + TargeVal4 string //填写的指标值4
  24 + CreatedAt time.Time //创建时间
  25 + UpdatedAt time.Time //更新时间
  26 + DeletedAt *time.Time //删除时间
  27 +}
  1 +package models
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 +)
  8 +
  9 +// RewardSummary 功过奖惩明细
  10 +type RewardSummary struct {
  11 + tableName string `pg:"manufacture.reward_summary,alias:reward_summary"`
  12 + Id int `pg:"pk:id"`
  13 + CompanyId int ``
  14 + OrgId int ``
  15 + RecordDate time.Time //日期
  16 + RecordDateStr string //日期 ;2006-01-02
  17 + RecordMonthStr string //月份 :200601
  18 + WorkStation domain.WorkStation // 工作位置
  19 + Worker domain.User //员工
  20 + UpToStandard float64 `comment:"合格率"` //合格率
  21 + UpToStandardResult int `comment:"合格率功过评定结果 1:功 -1:过 0:不奖不惩"` //合格率功过评定结果1:功 -1:过 0:不奖不惩
  22 + Yield float64 `comment:"产能"` //产能
  23 + YieldResult int `comment:"产能功过评定结果,1:功 -1:过 0:不奖不惩"` //产能功过评定结果,1:功 -1:过 0:不奖不惩
  24 + AccidentNum1 int `comment:"质量事故 次数"` //质量事故 次数
  25 + AccidentAmount1 float64 `comment:"质量事故 损失金额"` //质量事故 损失金额
  26 + AccidentResult1 int `comment:"质量事故 功过评定结果1:功 -1:过 0:不奖不惩"` //质量事故 功过评定结果1:功 -1:过 0:不奖不惩
  27 + AccidentNum2 int `comment:"安全事故 次数"` //安全事故 次数
  28 + AccidentAmount2 float64 `comment:"安全事故 损失金额"` //安全事故 损失金额
  29 + AccidentResult2 int `comment:"安全事故 功过评定结果 1:功 -1:过 0:不奖不惩"` //安全事故 功过评定结果 1:功 -1:过 0:不奖不惩
  30 + AccidentNum3 int `comment:"异物金属事故 次数"` //异物金属事故 次数
  31 + AccidentResult3 int `comment:"异物事故 功过评定结果 1:功 -1:过 0:不奖不惩"` //异物事故 功过评定结果 1:功 -1:过 0:不奖不惩
  32 + AccidentNum4 int `comment:"异物非金属事故 次数"` //异物非金属事故 次数
  33 + SummaryResult float64 `comment:"奖惩金额计算结果(元)"` //奖惩金额计算结果(元)
  34 + CreatedAt time.Time //
  35 + UpdatedAt time.Time //
  36 +
  37 +}
@@ -2,6 +2,7 @@ package repository @@ -2,6 +2,7 @@ package repository
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 +
5 "github.com/go-pg/pg/v10" 6 "github.com/go-pg/pg/v10"
6 7
7 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" 8 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
@@ -2,12 +2,13 @@ package repository @@ -2,12 +2,13 @@ package repository
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "time"
  6 +
5 "github.com/go-pg/pg/v10" 7 "github.com/go-pg/pg/v10"
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
10 - "time"  
11 12
12 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" 13 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
13 pgTransaction "github.com/linmadan/egglib-go/transaction/pg" 14 pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
@@ -176,7 +177,7 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac @@ -176,7 +177,7 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac
176 query.Where("created_at>=?", v.(time.Time)) 177 query.Where("created_at>=?", v.(time.Time))
177 } 178 }
178 if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) { 179 if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) {
179 - query.Where("created_at<?", v.(time.Time)) 180 + query.Where("created_at<=?", v.(time.Time))
180 } 181 }
181 if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 { 182 if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 {
182 query.Where(fmt.Sprintf(`product_record_info->>'batchNumber' like '%%%v%%'`, v)) 183 query.Where(fmt.Sprintf(`product_record_info->>'batchNumber' like '%%%v%%'`, v))
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "github.com/go-pg/pg/v10"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
  11 +)
  12 +
  13 +type ProductTroubleRepository struct {
  14 + transactionContext *pgTransaction.TransactionContext
  15 +}
  16 +
  17 +var _ domain.ProductTroubleRepository = (*ProductTroubleRepository)(nil)
  18 +
  19 +func NewProductTroubleRepository(transactionContext *pgTransaction.TransactionContext) (*ProductTroubleRepository, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + } else {
  23 + return &ProductTroubleRepository{
  24 + transactionContext: transactionContext,
  25 + }, nil
  26 + }
  27 +}
  28 +
  29 +func (repo *ProductTroubleRepository) Save(param *domain.ProductTrouble) (*domain.ProductTrouble, error) {
  30 + m := models.ProductTrouble{
  31 + Id: param.Id,
  32 + CompanyId: param.CompanyId,
  33 + OrgId: param.OrgId,
  34 + WorkStation: param.WorkStation,
  35 + ProductWorker: param.ProductWorker,
  36 + AmountLoss: param.AmountLoss,
  37 + Types: string(param.Types),
  38 + RecordDate: param.RecordDate,
  39 + Remark: param.Remark,
  40 + ApproveStatus: int(param.ApproveStatus),
  41 + ApproveAt: param.ApproveAt,
  42 + ApproveUser: param.ApproveUser,
  43 + CreatedAt: param.CreatedAt,
  44 + UpdatedAt: param.UpdatedAt,
  45 + DeletedAt: param.DeletedAt,
  46 + }
  47 + tx := repo.transactionContext.PgTx
  48 + if param.Id == 0 {
  49 + _, err := tx.Model(&m).Insert()
  50 + if err != nil {
  51 + return nil, err
  52 + }
  53 + param.Id = m.Id
  54 + } else {
  55 + _, err := tx.Model(&m).WherePK().Update()
  56 + if err != nil {
  57 + return nil, err
  58 + }
  59 + }
  60 +
  61 + return param, nil
  62 +}
  63 +
  64 +func (repo *ProductTroubleRepository) Remove(param *domain.ProductTrouble) (*domain.ProductTrouble, error) {
  65 + tx := repo.transactionContext.PgTx
  66 + m := new(models.ProductTrouble)
  67 + m.Id = param.Id
  68 + nowTime := time.Now()
  69 + param.DeletedAt = &nowTime
  70 + _, err := tx.Model(m).
  71 + WherePK().Set("deleted_at=?", nowTime).
  72 + Update()
  73 + if err != nil {
  74 + return param, err
  75 + }
  76 +
  77 + return nil, nil
  78 +}
  79 +
  80 +func (repo *ProductTroubleRepository) FindOne(queryOptions map[string]interface{}) (*domain.ProductTrouble, error) {
  81 + tx := repo.transactionContext.PgTx
  82 + m := new(models.ProductTrouble)
  83 + query := tx.Model(m).Where("deleted_at isnull")
  84 + if v, ok := queryOptions["id"]; ok {
  85 + query.Where("id=?", v)
  86 + }
  87 + err := query.First()
  88 + if err != nil {
  89 + if err == pg.ErrNoRows {
  90 + return nil, domain.ErrorNotFound
  91 + } else {
  92 + return nil, err
  93 + }
  94 + }
  95 + result := repo.TransformToDomain(m)
  96 + return result, nil
  97 +}
  98 +
  99 +func (repo *ProductTroubleRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.ProductTrouble, error) {
  100 + tx := repo.transactionContext.PgTx
  101 + m := []models.ProductTrouble{}
  102 + query := tx.Model(&m).
  103 + Where("deleted_at isnull").
  104 + Limit(20)
  105 + if v, ok := queryOptions["limit"].(int); ok && v > 0 {
  106 + query.Limit(v)
  107 + }
  108 +
  109 + if v, ok := queryOptions["offset"].(int); ok && v >= 0 {
  110 + query.Offset(v)
  111 + }
  112 +
  113 + if v, ok := queryOptions["companyId"]; ok {
  114 + query.Where("company_id=?", v)
  115 + }
  116 + if v, ok := queryOptions["orgId"]; ok {
  117 + query.Where("org_id=?", v)
  118 + }
  119 +
  120 + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
  121 + query.Where(fmt.Sprintf(`Work_station->>'workshopName' like '%%%v%%'`, v))
  122 + }
  123 +
  124 + if v, ok := queryOptions["productWorkerName"]; ok && len(v.(string)) > 0 {
  125 + query.Where(fmt.Sprintf(`product_worker->>'userName' like '%%%v%%'`, v))
  126 + }
  127 +
  128 + query.Order("id DESC")
  129 + cnt, err := query.SelectAndCount()
  130 + if err != nil {
  131 + return 0, nil, err
  132 + }
  133 +
  134 + var listData []*domain.ProductTrouble
  135 + for i := range m {
  136 + temp := repo.TransformToDomain(&m[i])
  137 + listData = append(listData, temp)
  138 + }
  139 + return int64(cnt), listData, nil
  140 +}
  141 +
  142 +func (repo *ProductTroubleRepository) TransformToDomain(param *models.ProductTrouble) *domain.ProductTrouble {
  143 + return &domain.ProductTrouble{
  144 + Id: param.Id,
  145 + CompanyId: param.CompanyId,
  146 + OrgId: param.OrgId,
  147 + WorkStation: param.WorkStation,
  148 + ProductWorker: param.ProductWorker,
  149 + AmountLoss: param.AmountLoss,
  150 + Types: domain.TroubleType(param.Types),
  151 + RecordDate: param.RecordDate,
  152 + Remark: param.Remark,
  153 + ApproveStatus: domain.ProductTroubleApprove(param.ApproveStatus),
  154 + ApproveAt: param.ApproveAt,
  155 + ApproveUser: param.ApproveUser,
  156 + CreatedAt: param.CreatedAt,
  157 + UpdatedAt: param.UpdatedAt,
  158 + DeletedAt: param.DeletedAt,
  159 + }
  160 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/go-pg/pg/v10"
  7 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
  10 +)
  11 +
  12 +type RewardRuleRepository struct {
  13 + transactionContext *pgTransaction.TransactionContext
  14 +}
  15 +
  16 +var _ domain.RewardRuleRepository = (*RewardRuleRepository)(nil)
  17 +
  18 +func NewRewardRuleRepository(transactionContext *pgTransaction.TransactionContext) (*RewardRuleRepository, error) {
  19 + if transactionContext == nil {
  20 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  21 + } else {
  22 + return &RewardRuleRepository{
  23 + transactionContext: transactionContext,
  24 + }, nil
  25 + }
  26 +}
  27 +
  28 +// func (repo *RewardStandardRepository) nextIdentify() (int64, error) {
  29 +// IdWorker, err := snowflake.NewIdWorker(1)
  30 +// if err != nil {
  31 +// return 0, err
  32 +// }
  33 +// id, err := IdWorker.NextId()
  34 +// return id, err
  35 +// }
  36 +
  37 +func (repo *RewardRuleRepository) Save(param *domain.RewardRule) (*domain.RewardRule, error) {
  38 + m := models.RewardRule{
  39 + Id: param.Id,
  40 + CompanyId: param.CompanyId,
  41 + OrgId: param.OrgId,
  42 + RewardTag: param.RewardTag,
  43 + RewardNum: param.RewardNum,
  44 + RewardAmount: param.RewardAmount,
  45 + FaultTag: param.FaultTag,
  46 + FaultNum: param.FaultNum,
  47 + FaultAmount: param.FaultAmount,
  48 + CreatedAt: param.CreatedAt,
  49 + UpdatedAt: param.UpdatedAt,
  50 + Remark: param.Remark,
  51 + }
  52 + tx := repo.transactionContext.PgTx
  53 + if param.Id == 0 {
  54 + _, err := tx.Model(&m).Insert()
  55 + if err != nil {
  56 + return nil, err
  57 + }
  58 + param.Id = m.Id
  59 + } else {
  60 + _, err := tx.Model(&m).WherePK().Update()
  61 + if err != nil {
  62 + return nil, err
  63 + }
  64 + }
  65 +
  66 + return param, nil
  67 +}
  68 +
  69 +// func (repo *RewardRuleRepository) Remove(param *domain.RewardStandard) (*domain.RewardStandard, error) {
  70 +// tx := repo.transactionContext.PgTx
  71 +// m := new(models.RewardStandard)
  72 +// m.Id = param.Id
  73 +// nowTime := time.Now()
  74 +// param.DeletedAt = &nowTime
  75 +// _, err := tx.Model(m).
  76 +// WherePK().Set("deleted_at=?", nowTime).
  77 +// Update()
  78 +// if err != nil {
  79 +// return param, err
  80 +// }
  81 +
  82 +// return nil, nil
  83 +// }
  84 +
  85 +func (repo *RewardRuleRepository) FindOne(queryOptions map[string]interface{}) (*domain.RewardRule, error) {
  86 + tx := repo.transactionContext.PgTx
  87 + m := new(models.RewardRule)
  88 + query := tx.Model(m)
  89 + if v, ok := queryOptions["id"]; ok {
  90 + query.Where("id=?", v)
  91 + }
  92 + err := query.First()
  93 + if err != nil {
  94 + if err == pg.ErrNoRows {
  95 + return nil, domain.ErrorNotFound
  96 + } else {
  97 + return nil, err
  98 + }
  99 + }
  100 + result := repo.TransformToDomain(m)
  101 + return result, nil
  102 +}
  103 +
  104 +func (repo *RewardRuleRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.RewardRule, error) {
  105 + tx := repo.transactionContext.PgTx
  106 + m := []models.RewardRule{}
  107 + query := tx.Model(&m).
  108 + Limit(20)
  109 + if v, ok := queryOptions["limit"].(int); ok {
  110 + query.Limit(v)
  111 + }
  112 + if v, ok := queryOptions["offset"].(int); ok {
  113 + query.Offset(v)
  114 + }
  115 + if v, ok := queryOptions["companyId"]; ok {
  116 + query.Where("company_id=?", v)
  117 + }
  118 + if v, ok := queryOptions["orgId"]; ok {
  119 + query.Where("org_id=?", v)
  120 + }
  121 + cnt, err := query.SelectAndCount()
  122 + if err != nil {
  123 + return 0, nil, err
  124 + }
  125 +
  126 + var listData []*domain.RewardRule
  127 + for i := range m {
  128 + temp := repo.TransformToDomain(&m[i])
  129 + listData = append(listData, temp)
  130 + }
  131 + return int64(cnt), listData, nil
  132 +}
  133 +
  134 +func (repo *RewardRuleRepository) TransformToDomain(param *models.RewardRule) *domain.RewardRule {
  135 + return &domain.RewardRule{
  136 + Id: param.Id,
  137 + CompanyId: param.CompanyId,
  138 + OrgId: param.OrgId,
  139 + RewardTag: param.RewardTag,
  140 + RewardNum: param.RewardNum,
  141 + RewardAmount: param.RewardAmount,
  142 + FaultTag: param.FaultTag,
  143 + FaultNum: param.FaultNum,
  144 + FaultAmount: param.FaultAmount,
  145 + CreatedAt: param.CreatedAt,
  146 + UpdatedAt: param.UpdatedAt,
  147 + Remark: param.Remark,
  148 + }
  149 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "github.com/go-pg/pg/v10"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
  11 +)
  12 +
  13 +type RewardStandardRepository struct {
  14 + transactionContext *pgTransaction.TransactionContext
  15 +}
  16 +
  17 +var _ domain.RewardStandardRepository = (*RewardStandardRepository)(nil)
  18 +
  19 +func NewRewardStandardRepository(transactionContext *pgTransaction.TransactionContext) (*RewardStandardRepository, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + } else {
  23 + return &RewardStandardRepository{
  24 + transactionContext: transactionContext,
  25 + }, nil
  26 + }
  27 +}
  28 +
  29 +// func (repo *RewardStandardRepository) nextIdentify() (int64, error) {
  30 +// IdWorker, err := snowflake.NewIdWorker(1)
  31 +// if err != nil {
  32 +// return 0, err
  33 +// }
  34 +// id, err := IdWorker.NextId()
  35 +// return id, err
  36 +// }
  37 +
  38 +func (repo *RewardStandardRepository) Save(param *domain.RewardStandard) (*domain.RewardStandard, error) {
  39 + m := models.RewardStandard{
  40 + Id: param.Id,
  41 + Workshop: param.Workshop,
  42 + ProductLine: param.ProductLine,
  43 + ProductSection: param.ProductSection,
  44 + Remark: param.Remark,
  45 + TargetType: param.TargetType,
  46 + TargeVal1: param.TargeVal1,
  47 + TargeVal2: param.TargeVal2,
  48 + TargeVal3: param.TargeVal3,
  49 + TargeVal4: param.TargeVal4,
  50 + CreatedAt: param.CreatedAt,
  51 + UpdatedAt: param.UpdatedAt,
  52 + DeletedAt: param.DeletedAt,
  53 + CompanyId: param.CompanyId,
  54 + OrgId: param.OrgId,
  55 + }
  56 + tx := repo.transactionContext.PgTx
  57 + if param.Id == 0 {
  58 + _, err := tx.Model(&m).Insert()
  59 + if err != nil {
  60 + return nil, err
  61 + }
  62 + param.Id = m.Id
  63 + } else {
  64 + _, err := tx.Model(&m).WherePK().Update()
  65 + if err != nil {
  66 + return nil, err
  67 + }
  68 + }
  69 +
  70 + return param, nil
  71 +}
  72 +
  73 +func (repo *RewardStandardRepository) Remove(param *domain.RewardStandard) (*domain.RewardStandard, error) {
  74 + tx := repo.transactionContext.PgTx
  75 + m := new(models.RewardStandard)
  76 + m.Id = param.Id
  77 + nowTime := time.Now()
  78 + param.DeletedAt = &nowTime
  79 + _, err := tx.Model(m).
  80 + WherePK().Set("deleted_at=?", nowTime).
  81 + Update()
  82 + if err != nil {
  83 + return param, err
  84 + }
  85 +
  86 + return nil, nil
  87 +}
  88 +
  89 +func (repo *RewardStandardRepository) FindOne(queryOptions map[string]interface{}) (*domain.RewardStandard, error) {
  90 + tx := repo.transactionContext.PgTx
  91 + m := new(models.RewardStandard)
  92 + query := tx.Model(m).Where("deleted_at isnull")
  93 + if v, ok := queryOptions["id"]; ok {
  94 + query.Where("id=?", v)
  95 + }
  96 + err := query.First()
  97 + if err != nil {
  98 + if err == pg.ErrNoRows {
  99 + return nil, domain.ErrorNotFound
  100 + } else {
  101 + return nil, err
  102 + }
  103 + }
  104 + result := repo.TransformToDomain(m)
  105 + return result, nil
  106 +}
  107 +
  108 +func (repo *RewardStandardRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.RewardStandard, error) {
  109 + tx := repo.transactionContext.PgTx
  110 + m := []models.RewardStandard{}
  111 + query := tx.Model(&m).
  112 + Where("deleted_at isnull").
  113 + Limit(20)
  114 + if v, ok := queryOptions["limit"].(int); ok {
  115 + query.Limit(v)
  116 + }
  117 + if v, ok := queryOptions["companyId"]; ok {
  118 + query.Where("company_id=?", v)
  119 + }
  120 + if v, ok := queryOptions["orgId"]; ok {
  121 + query.Where("org_id=?", v)
  122 + }
  123 +
  124 + if v, ok := queryOptions["offset"].(int); ok {
  125 + query.Offset(v)
  126 + }
  127 + if v, ok := queryOptions["workshopId"]; ok {
  128 + query.Where("workshop->>'workshopId'='?'", v)
  129 + }
  130 + if v, ok := queryOptions["lineId"]; ok {
  131 + query.Where("product_line->>'lineId'='?'", v)
  132 + }
  133 + if v, ok := queryOptions["sectionId"]; ok {
  134 + query.Where("product_section->>'sectionId'='?'", v)
  135 + }
  136 +
  137 + if v, ok := queryOptions["targetType"]; ok {
  138 + query.Where("target_type=?", v)
  139 + }
  140 +
  141 + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
  142 + query.Where(fmt.Sprintf(`workshop->>'workshopName' like '%%%v%%'`, v))
  143 + }
  144 + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 {
  145 + query.Where(fmt.Sprintf(`product_line->>'lineName' like '%%%v%%'`, v))
  146 + }
  147 + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 {
  148 + query.Where(fmt.Sprintf(`product_section->>'sectionName' like '%%%v%%'`, v))
  149 + }
  150 +
  151 + cnt, err := query.SelectAndCount()
  152 + if err != nil {
  153 + return 0, nil, err
  154 + }
  155 +
  156 + var listData []*domain.RewardStandard
  157 + for i := range m {
  158 + temp := repo.TransformToDomain(&m[i])
  159 + listData = append(listData, temp)
  160 + }
  161 + return int64(cnt), listData, nil
  162 +}
  163 +
  164 +func (repo *RewardStandardRepository) TransformToDomain(param *models.RewardStandard) *domain.RewardStandard {
  165 + return &domain.RewardStandard{
  166 + Id: param.Id,
  167 + Workshop: param.Workshop,
  168 + ProductLine: param.ProductLine,
  169 + ProductSection: param.ProductSection,
  170 + Remark: param.Remark,
  171 + TargetType: param.TargetType,
  172 + TargeVal1: param.TargeVal1,
  173 + TargeVal2: param.TargeVal2,
  174 + TargeVal3: param.TargeVal3,
  175 + TargeVal4: param.TargeVal4,
  176 + CreatedAt: param.CreatedAt,
  177 + UpdatedAt: param.UpdatedAt,
  178 + DeletedAt: param.DeletedAt,
  179 + CompanyId: param.CompanyId,
  180 + OrgId: param.OrgId,
  181 + }
  182 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "time"
  6 +
  7 + "github.com/go-pg/pg/v10"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
  11 +)
  12 +
  13 +type RewardSummaryRepository struct {
  14 + transactionContext *pgTransaction.TransactionContext
  15 +}
  16 +
  17 +var _ domain.RewardSummaryRepository = (*RewardSummaryRepository)(nil)
  18 +
  19 +func NewRewardSummaryRepository(transactionContext *pgTransaction.TransactionContext) (*RewardSummaryRepository, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + } else {
  23 + return &RewardSummaryRepository{
  24 + transactionContext: transactionContext,
  25 + }, nil
  26 + }
  27 +}
  28 +
  29 +func (repo *RewardSummaryRepository) Save(param *domain.RewardSummary) (*domain.RewardSummary, error) {
  30 + m := models.RewardSummary{
  31 + Id: param.Id,
  32 + CompanyId: param.CompanyId,
  33 + OrgId: param.OrgId,
  34 + RecordDate: param.RecordDate,
  35 + RecordDateStr: param.RecordDateStr,
  36 + WorkStation: param.WorkStation,
  37 + Worker: param.Worker,
  38 + UpToStandard: param.UpToStandard,
  39 + Yield: param.Yield,
  40 + AccidentNum1: param.AccidentNum1,
  41 + AccidentAmount1: param.AccidentAmount1,
  42 + AccidentNum2: param.AccidentNum2,
  43 + AccidentAmount2: param.AccidentAmount2,
  44 + AccidentNum3: param.AccidentNum3,
  45 + AccidentNum4: param.AccidentNum4,
  46 + CreatedAt: param.CreatedAt,
  47 + UpdatedAt: param.UpdatedAt,
  48 + SummaryResult: param.SummaryResult,
  49 + }
  50 + tx := repo.transactionContext.PgTx
  51 + if param.Id == 0 {
  52 + _, err := tx.Model(&m).Insert()
  53 + if err != nil {
  54 + return nil, err
  55 + }
  56 + param.Id = m.Id
  57 + } else {
  58 + _, err := tx.Model(&m).WherePK().Update()
  59 + if err != nil {
  60 + return nil, err
  61 + }
  62 + }
  63 +
  64 + return param, nil
  65 +}
  66 +
  67 +func (repo *RewardSummaryRepository) FindOne(queryOptions map[string]interface{}) (*domain.RewardSummary, error) {
  68 + tx := repo.transactionContext.PgTx
  69 + m := new(models.RewardSummary)
  70 + query := tx.Model(m)
  71 + if v, ok := queryOptions["id"]; ok {
  72 + query.Where("id=?", v)
  73 + }
  74 + err := query.First()
  75 + if err != nil {
  76 + if err == pg.ErrNoRows {
  77 + return nil, domain.ErrorNotFound
  78 + } else {
  79 + return nil, err
  80 + }
  81 + }
  82 + result := repo.TransformToDomain(m)
  83 + return result, nil
  84 +}
  85 +
  86 +func (repo *RewardSummaryRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.RewardSummary, error) {
  87 + tx := repo.transactionContext.PgTx
  88 + m := []models.RewardSummary{}
  89 + query := tx.Model(&m).
  90 + Limit(20)
  91 + if v, ok := queryOptions["limit"].(int); ok && v >= 0 {
  92 + query.Limit(v)
  93 + }
  94 + if v, ok := queryOptions["offset"].(int); ok && v >= 0 {
  95 + query.Offset(v)
  96 + }
  97 + if v, ok := queryOptions["companyId"]; ok {
  98 + query.Where("company_id=?", v)
  99 + }
  100 + if v, ok := queryOptions["orgId"]; ok {
  101 + query.Where("org_id=?", v)
  102 + }
  103 + //车间名称
  104 + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
  105 + query.Where(`Work_station->>'workshopName' like ?`, fmt.Sprintf("%%%v%%", v))
  106 + }
  107 + //线别名称
  108 + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 {
  109 + query.Where(`Work_station->>'lineName' like ?`, fmt.Sprintf("%%%v%%", v))
  110 + }
  111 + //工段id
  112 + if v, ok := queryOptions["sectionId"]; ok {
  113 + query.Where(`Work_station->>'sectionId' = '?'`, v)
  114 + }
  115 + //车间id
  116 + if v, ok := queryOptions["workshopId"]; ok {
  117 + query.Where(`Work_station->>'workshopId'='?'`, v)
  118 + }
  119 + //线别id
  120 + if v, ok := queryOptions["lineId"]; ok {
  121 + query.Where(`Work_station->>'lineId' = '?'`, v)
  122 + }
  123 + //日期开始
  124 + if v, ok := queryOptions["beginDate"]; ok {
  125 + if !(v.(time.Time)).IsZero() {
  126 + query.Where("record_date>=?", v)
  127 + }
  128 + }
  129 + //日期结束
  130 + if v, ok := queryOptions["endDate"]; ok {
  131 + if !(v.(time.Time)).IsZero() {
  132 + query.Where("record_date<=?", v)
  133 + }
  134 + }
  135 +
  136 + //指定查询某个日期
  137 + if v, ok := queryOptions["recordDateStr"]; ok {
  138 + query.Where("record_date_str=?", v)
  139 + }
  140 + //用户id
  141 + if v, ok := queryOptions["workerId"]; ok {
  142 + query.Where(`worker->>'userId'='?'`, v)
  143 + }
  144 + cnt, err := query.SelectAndCount()
  145 + if err != nil {
  146 + return 0, nil, err
  147 + }
  148 +
  149 + var listData []*domain.RewardSummary
  150 + for i := range m {
  151 + temp := repo.TransformToDomain(&m[i])
  152 + listData = append(listData, temp)
  153 + }
  154 + return int64(cnt), listData, nil
  155 +}
  156 +
  157 +func (repo *RewardSummaryRepository) TransformToDomain(param *models.RewardSummary) *domain.RewardSummary {
  158 + return &domain.RewardSummary{
  159 + Id: param.Id,
  160 + CompanyId: param.CompanyId,
  161 + OrgId: param.OrgId,
  162 + RecordDate: param.RecordDate,
  163 + WorkStation: param.WorkStation,
  164 + Worker: param.Worker,
  165 + UpToStandard: param.UpToStandard,
  166 + Yield: param.Yield,
  167 + AccidentNum1: param.AccidentNum1,
  168 + AccidentAmount1: param.AccidentAmount1,
  169 + AccidentNum2: param.AccidentNum2,
  170 + AccidentAmount2: param.AccidentAmount2,
  171 + AccidentNum3: param.AccidentNum3,
  172 + AccidentNum4: param.AccidentNum4,
  173 + CreatedAt: param.CreatedAt,
  174 + UpdatedAt: param.UpdatedAt,
  175 + SummaryResult: param.SummaryResult,
  176 + RecordDateStr: param.RecordDateStr,
  177 + }
  178 +}
1 package beego 1 package beego
2 2
3 import ( 3 import (
4 - "github.com/beego/beego/v2/server/web"  
5 - "github.com/linmadan/egglib-go/web/beego/filters"  
6 - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"  
7 "net/http" 4 "net/http"
8 "net/http/pprof" 5 "net/http/pprof"
9 "os" 6 "os"
10 "strconv" 7 "strconv"
11 8
  9 + "github.com/beego/beego/v2/server/web"
  10 + "github.com/linmadan/egglib-go/web/beego/filters"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
  12 +
12 . "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 13 . "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
13 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/routers" 14 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/routers"
14 ) 15 )
@@ -17,7 +18,7 @@ func init() { @@ -17,7 +18,7 @@ func init() {
17 web.BConfig.AppName = "project" 18 web.BConfig.AppName = "project"
18 web.BConfig.CopyRequestBody = true 19 web.BConfig.CopyRequestBody = true
19 web.BConfig.RunMode = "dev" 20 web.BConfig.RunMode = "dev"
20 - web.BConfig.Listen.HTTPPort = 8080 21 + web.BConfig.Listen.HTTPPort = 8083
21 web.BConfig.Listen.EnableAdmin = false 22 web.BConfig.Listen.EnableAdmin = false
22 web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego/routers" 23 web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego/routers"
23 if os.Getenv("RUN_MODE") != "" { 24 if os.Getenv("RUN_MODE") != "" {
@@ -30,7 +31,7 @@ func init() { @@ -30,7 +31,7 @@ func init() {
30 } 31 }
31 } 32 }
32 //https支持 33 //https支持
33 - web.BConfig.Listen.EnableHTTPS = true 34 + web.BConfig.Listen.EnableHTTPS = false
34 web.BConfig.Listen.HTTPSPort = 443 35 web.BConfig.Listen.HTTPSPort = 443
35 36
36 //进程内监控 37 //进程内监控
@@ -60,7 +61,7 @@ func init() { @@ -60,7 +61,7 @@ func init() {
60 61
61 web.BConfig.Listen.HTTPSCertFile = "./config/fjmaimaimai.com_bundle.crt" 62 web.BConfig.Listen.HTTPSCertFile = "./config/fjmaimaimai.com_bundle.crt"
62 web.BConfig.Listen.HTTPSKeyFile = "./config/fjmaimaimai.com.key" 63 web.BConfig.Listen.HTTPSKeyFile = "./config/fjmaimaimai.com.key"
63 - web.InsertFilter("/*", web.BeforeExec, filters.AllowCors()) 64 + web.InsertFilter("/*", web.BeforeRouter, filters.AllowCors())
64 web.InsertFilter("/*", web.BeforeExec, filters.CreateRequstLogFilter(Logger)) 65 web.InsertFilter("/*", web.BeforeExec, filters.CreateRequstLogFilter(Logger))
65 web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(Logger), web.WithReturnOnOutput(false)) 66 web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(Logger), web.WithReturnOnOutput(false))
66 } 67 }
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/web/beego"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/statistics/service"
  6 +)
  7 +
  8 +type BoardDataController struct {
  9 + beego.BaseController
  10 +}
  11 +
  12 +// 车间描述
  13 +func (c *BoardDataController) WorkshopDesc() {
  14 + srv := service.NewCommonStatisticsService(nil)
  15 + data, err := srv.WorkshopDesc()
  16 + c.Response(data, err)
  17 +}
  18 +
  19 +func (c *BoardDataController) EmployeeWorkpieceRatio() {
  20 + srv := service.NewCommonStatisticsService(nil)
  21 + data, err := srv.EmployeeWorkpieceRatio()
  22 + c.Response(data, err)
  23 +}
  24 +
  25 +// 时段产能
  26 +func (c *BoardDataController) TimeSectionProductRecord() {
  27 + srv := service.NewCommonStatisticsService(nil)
  28 + data, err := srv.TimeSectionProductRecord()
  29 + c.Response(data, err)
  30 +}
  31 +
  32 +func (c *BoardDataController) TopShow() {
  33 + srv := service.NewCommonStatisticsService(nil)
  34 + data, err := srv.TopShow()
  35 + c.Response(data, err)
  36 +}
  37 +
  38 +func (c *BoardDataController) ProportionOfSecondLevel() {
  39 + srv := service.NewCommonStatisticsService(nil)
  40 + data, err := srv.ProportionOfSecondLevel()
  41 + c.Response(data, err)
  42 +}
  43 +
  44 +func (c *BoardDataController) SectionProductInfo() {
  45 + srv := service.NewCommonStatisticsService(nil)
  46 + data, err := srv.SectionProductInfo()
  47 + c.Response(data, err)
  48 +}
  49 +
  50 +func (c *BoardDataController) WorkshopPlanCompletionCurrent() {
  51 + srv := service.NewCommonStatisticsService(nil)
  52 + data, err := srv.WorkshopPlanCompletionCurrent()
  53 + c.Response(data, err)
  54 +}
  55 +
  56 +func (c *BoardDataController) WorkshopPlanCompletion5Day() {
  57 + srv := service.NewCommonStatisticsService(nil)
  58 + data, err := srv.WorkshopPlanCompletion5Day()
  59 + c.Response(data, err)
  60 +}
  61 +
  62 +func (c *BoardDataController) ProductPlan() {
  63 + srv := service.NewCommonStatisticsService(nil)
  64 + data, err := srv.ProductPlan()
  65 + c.Response(data, err)
  66 +}
@@ -2,14 +2,16 @@ package controllers @@ -2,14 +2,16 @@ package controllers
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "io"
  6 + "path/filepath"
  7 +
5 "github.com/beego/beego/v2/server/web/context" 8 "github.com/beego/beego/v2/server/web/context"
  9 + "github.com/linmadan/egglib-go/core/application"
6 "github.com/linmadan/egglib-go/utils/excel" 10 "github.com/linmadan/egglib-go/utils/excel"
7 "github.com/linmadan/egglib-go/web/beego" 11 "github.com/linmadan/egglib-go/web/beego"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/service" 13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/service"
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
11 - "io"  
12 - "path/filepath"  
13 ) 15 )
14 16
15 type ExcelDataController struct { 17 type ExcelDataController struct {
@@ -29,6 +31,7 @@ func (controller *ExcelDataController) responseExcelByFile(ctx *context.Context, @@ -29,6 +31,7 @@ func (controller *ExcelDataController) responseExcelByFile(ctx *context.Context,
29 return nil 31 return nil
30 } 32 }
31 33
  34 +// FileImport 导入excel数据
32 func (controller *ExcelDataController) FileImport() { 35 func (controller *ExcelDataController) FileImport() {
33 var ( 36 var (
34 data interface{} 37 data interface{}
@@ -36,10 +39,11 @@ func (controller *ExcelDataController) FileImport() { @@ -36,10 +39,11 @@ func (controller *ExcelDataController) FileImport() {
36 r io.Reader 39 r io.Reader
37 ext string 40 ext string
38 ) 41 )
39 - //excelService := service.NewExcelDataService(nil) 42 + excelService := service.NewExcelDataService(nil)
40 r, ext, err = controller.GetFileWithExt() 43 r, ext, err = controller.GetFileWithExt()
41 if err != nil { 44 if err != nil {
42 - controller.Response(nil, err) 45 + e := application.ThrowError(application.BUSINESS_ERROR, err.Error())
  46 + controller.Response(nil, e)
43 return 47 return
44 } 48 }
45 cmd := &command.ImportDataCommand{} 49 cmd := &command.ImportDataCommand{}
@@ -54,8 +58,16 @@ func (controller *ExcelDataController) FileImport() { @@ -54,8 +58,16 @@ func (controller *ExcelDataController) FileImport() {
54 // data, err = excelService.ImportCooperationUser(cmd) 58 // data, err = excelService.ImportCooperationUser(cmd)
55 //case domain.ImportOrganization: 59 //case domain.ImportOrganization:
56 // data, err = excelService.ImportOrganization(cmd) 60 // data, err = excelService.ImportOrganization(cmd)
  61 + case "ImportProductTrouble":
  62 + data, err = excelService.ImportProductTrouble(cmd)
  63 + case "ImportProductRecordLevel2":
  64 + data, err = excelService.ImportProductRecord(cmd)
  65 + case "ImportAttendance":
  66 + data, err = excelService.ImportDataAttendance(cmd)
  67 + case "ImportProductCapacities":
  68 + data, err = excelService.ImportProductCapacities(cmd)
57 default: 69 default:
58 - err = fmt.Errorf("导入不存在 Code:%v", cmd.Code) 70 + err = application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("导入不存在 Code:%v", cmd.Code))
59 } 71 }
60 controller.Response(data, err) 72 controller.Response(data, err)
61 } 73 }
@@ -109,7 +121,7 @@ func (controller *ExcelDataController) FileExport() { @@ -109,7 +121,7 @@ func (controller *ExcelDataController) FileExport() {
109 controller.responseExcelByFile(controller.Ctx, excelTool, filename) 121 controller.responseExcelByFile(controller.Ctx, excelTool, filename)
110 } 122 }
111 123
112 -//GetExcelDataFields 获取导出excel数据的可选字段 124 +// GetExcelDataFields 获取导出excel数据的可选字段
113 func (controller *ExcelDataController) GetExcelDataFields() { 125 func (controller *ExcelDataController) GetExcelDataFields() {
114 126
115 } 127 }
@@ -129,8 +141,8 @@ func (controller *ExcelDataController) GetFileWithExt() (io.Reader, string, erro @@ -129,8 +141,8 @@ func (controller *ExcelDataController) GetFileWithExt() (io.Reader, string, erro
129 141
130 func (controller *ExcelDataController) FileImportTemplate() { 142 func (controller *ExcelDataController) FileImportTemplate() {
131 excelService := service.NewExcelDataService(nil) 143 excelService := service.NewExcelDataService(nil)
132 - cmd := &command.ImportDataCommand{}  
133 code := controller.GetString(":code") 144 code := controller.GetString(":code")
  145 + cmd := &command.ImportDataCommand{}
134 cmd.Code = code 146 cmd.Code = code
135 var data interface{} 147 var data interface{}
136 data, err := excelService.FileImportTemplate(cmd) 148 data, err := excelService.FileImportTemplate(cmd)
@@ -13,9 +13,10 @@ type ProductRecordController struct { @@ -13,9 +13,10 @@ type ProductRecordController struct {
13 13
14 func (controller *ProductRecordController) CreateProductRecord() { 14 func (controller *ProductRecordController) CreateProductRecord() {
15 productRecordService := service.NewProductRecordService(nil) 15 productRecordService := service.NewProductRecordService(nil)
16 - createProductRecordCommand := &command.CreateProductRecordCommand{}  
17 - controller.Unmarshal(createProductRecordCommand)  
18 - data, err := productRecordService.CreateProductRecord(createProductRecordCommand) 16 + createCommand := &command.CreateProductRecordCommand{}
  17 + Must(controller.Unmarshal(createCommand))
  18 + operateInfo := ParseOperateInfo(controller.BaseController)
  19 + data, err := productRecordService.CreateProductRecord(operateInfo, createCommand)
19 controller.Response(data, err) 20 controller.Response(data, err)
20 } 21 }
21 22
@@ -127,3 +128,65 @@ func (controller *ProductRecordController) SearchWorkshopProductRecord() { @@ -127,3 +128,65 @@ func (controller *ProductRecordController) SearchWorkshopProductRecord() {
127 total, data, err := productPlanService.SearchWorkshopProductRecord(ParseOperateInfo(controller.BaseController), cmd) 128 total, data, err := productPlanService.SearchWorkshopProductRecord(ParseOperateInfo(controller.BaseController), cmd)
128 ResponseGrid(controller.BaseController, total, data, err) 129 ResponseGrid(controller.BaseController, total, data, err)
129 } 130 }
  131 +
  132 +// 产能管理 添加产能
  133 +func (controller *ProductRecordController) CreateProductCapacities() {
  134 + productRecordService := service.NewProductRecordService(nil)
  135 + saveCommand := &command.CreateProductCapacitiesCmd{}
  136 + controller.Unmarshal(saveCommand)
  137 + operateInfo := ParseOperateInfo(controller.BaseController)
  138 + data, err := productRecordService.CreateProductCapacities(operateInfo, saveCommand)
  139 + controller.Response(data, err)
  140 +}
  141 +
  142 +// 产能管理 编辑产能
  143 +func (controller *ProductRecordController) UpdateProductCapacities() {
  144 + productRecordService := service.NewProductRecordService(nil)
  145 + saveCommand := &command.SaveProductCapacitiesCmd{}
  146 + controller.Unmarshal(saveCommand)
  147 + productRecordId, _ := controller.GetInt(":productRecordId")
  148 + saveCommand.ProductRecordId = productRecordId
  149 + operateInfo := ParseOperateInfo(controller.BaseController)
  150 + data, err := productRecordService.SaveProductCapacities(operateInfo, saveCommand)
  151 + controller.Response(data, err)
  152 +}
  153 +
  154 +// 产能管理 产能列表
  155 +func (controller *ProductRecordController) ListProductCapacities() {
  156 + productRecordService := service.NewProductRecordService(nil)
  157 + listQury := &query.ListProductCapacitiesQuery{}
  158 + controller.Unmarshal(listQury)
  159 + operateInfo := ParseOperateInfo(controller.BaseController)
  160 + listQury.CompanyId = operateInfo.CompanyId
  161 + listQury.OrgId = operateInfo.OrgId
  162 + total, data, err := productRecordService.ListProductCapacities(operateInfo, listQury)
  163 + ResponseGrid(controller.BaseController, total, data, err)
  164 +}
  165 +
  166 +// 产能管理 产能详情
  167 +func (controller *ProductRecordController) GetProductCapacities() {
  168 + productRecordService := service.NewProductRecordService(nil)
  169 + productRecordId, _ := controller.GetInt(":productRecordId")
  170 + operateInfo := ParseOperateInfo(controller.BaseController)
  171 + data, err := productRecordService.GetProductCapacities(operateInfo, productRecordId)
  172 + controller.Response(data, err)
  173 +}
  174 +
  175 +// 产能管理 删除产能
  176 +func (controller *ProductRecordController) DeleteProductCapacities() {
  177 + productRecordService := service.NewProductRecordService(nil)
  178 + productRecordId, _ := controller.GetInt(":productRecordId")
  179 + operateInfo := ParseOperateInfo(controller.BaseController)
  180 + data, err := productRecordService.DeleteProductCapacities(operateInfo, productRecordId)
  181 + controller.Response(data, err)
  182 +}
  183 +
  184 +// 产能管理 审核产能
  185 +func (controller *ProductRecordController) ApproveProductCapacities() {
  186 + productRecordService := service.NewProductRecordService(nil)
  187 + queryCommand := &query.GetProductCapacitiesQuery{}
  188 + controller.Unmarshal(queryCommand)
  189 + operateInfo := ParseOperateInfo(controller.BaseController)
  190 + data, err := productRecordService.ApproveProductCapacities(operateInfo, queryCommand.EmployeeProductRecordId)
  191 + controller.Response(data, err)
  192 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/web/beego"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/command"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/query"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productTrouble/service"
  8 +)
  9 +
  10 +type ProductTroubleController struct {
  11 + beego.BaseController
  12 +}
  13 +
  14 +// 创建事故记录
  15 +func (c *ProductTroubleController) CreatedProductTrouble() {
  16 + srv := service.NewProductTroubleService(nil)
  17 + createCommand := &command.CreateProductTroubleCommand{}
  18 + Must(c.Unmarshal(createCommand))
  19 + operater := ParseOperateInfo(c.BaseController)
  20 + data, err := srv.CreateProductTrouble(operater, createCommand)
  21 + c.Response(data, err)
  22 +}
  23 +
  24 +// 更新事故记录
  25 +func (c *ProductTroubleController) UpdateProductTrouble() {
  26 + srv := service.NewProductTroubleService(nil)
  27 + createCommand := &command.SaveProductTroubleCommand{}
  28 + Must(c.Unmarshal(createCommand))
  29 + id, _ := c.GetInt(":id")
  30 + createCommand.Id = id
  31 + operater := ParseOperateInfo(c.BaseController)
  32 + data, err := srv.SaveProductTrouble(operater, createCommand)
  33 + c.Response(data, err)
  34 +}
  35 +
  36 +// 获取事故记录
  37 +func (c *ProductTroubleController) GetProductTrouble() {
  38 + srv := service.NewProductTroubleService(nil)
  39 + id, _ := c.GetInt(":id")
  40 +
  41 + data, err := srv.GetProductTrouble(id)
  42 + c.Response(data, err)
  43 +}
  44 +
  45 +// 删除事故记录
  46 +func (c *ProductTroubleController) DeleteProductTrouble() {
  47 + srv := service.NewProductTroubleService(nil)
  48 + getQuery := &query.GetProductTroubleQuery{}
  49 + Must(c.Unmarshal(getQuery))
  50 + err := srv.DeleteProductTrouble(int64(getQuery.Id))
  51 + c.Response(nil, err)
  52 +}
  53 +
  54 +// 获取事故记录列表
  55 +func (c *ProductTroubleController) ListProductTrouble() {
  56 + srv := service.NewProductTroubleService(nil)
  57 + getQuery := query.ListProductTrouble{}
  58 + Must(c.Unmarshal(&getQuery))
  59 + operater := ParseOperateInfo(c.BaseController)
  60 + getQuery.CompanyId = operater.CompanyId
  61 + getQuery.OrgId = operater.OrgId
  62 + total, data, err := srv.ListProductTrouble(&getQuery)
  63 + ResponseGrid(c.BaseController, total, data, err)
  64 +}
  65 +
  66 +// 审核事故记录
  67 +func (c *ProductTroubleController) ApproveProductTrouble() {
  68 + srv := service.NewProductTroubleService(nil)
  69 + getQuery := &query.GetProductTroubleQuery{}
  70 + Must(c.Unmarshal(getQuery))
  71 + operater := ParseOperateInfo(c.BaseController)
  72 + err := srv.ApproveProductTrouble(operater, int64(getQuery.Id))
  73 + c.Response(nil, err)
  74 +}
  75 +
  76 +func (c *ProductTroubleController) ListRewardSummary() {
  77 + srv := service.NewProductTroubleService(nil)
  78 + getQuery := query.ListRewardSummaryQuery{}
  79 + Must(c.Unmarshal(&getQuery))
  80 + operater := ParseOperateInfo(c.BaseController)
  81 + getQuery.CompanyId = operater.CompanyId
  82 + getQuery.OrgId = operater.OrgId
  83 + total, data, err := srv.ListRewardSummary(&getQuery)
  84 + ResponseGrid(c.BaseController, total, data, err)
  85 +}
  86 +
  87 +// 功过看板 日榜
  88 +func (c *ProductTroubleController) RewardSummaryPublicNoticeDay() {
  89 + srv := service.NewProductTroubleService(nil)
  90 + operater := ParseOperateInfo(c.BaseController)
  91 + data, err := srv.RewardSummaryPublicNoticeDay(operater)
  92 + c.Response(data, err)
  93 +}
  94 +
  95 +// 功过看板 产效
  96 +func (c *ProductTroubleController) RewardSummaryPublicNoticeYield() {
  97 + srv := service.NewProductTroubleService(nil)
  98 + operater := ParseOperateInfo(c.BaseController)
  99 + data, err := srv.RewardSummaryPublicNoticeYield(operater)
  100 + c.Response(data, err)
  101 +}
  102 +
  103 +// 功过看板 合格率
  104 +func (c *ProductTroubleController) RewardSummaryPublicNoticeUpToStandard() {
  105 + srv := service.NewProductTroubleService(nil)
  106 + operater := ParseOperateInfo(c.BaseController)
  107 + data, err := srv.RewardSummaryPublicNoticeUpToStandard(operater)
  108 + c.Response(data, err)
  109 +}
  110 +
  111 +// 功过看板 异常
  112 +func (c *ProductTroubleController) RewardSummaryPublicNoticeAccident() {
  113 + srv := service.NewProductTroubleService(nil)
  114 + operater := ParseOperateInfo(c.BaseController)
  115 + data, err := srv.RewardSummaryPublicNoticeAccident(operater)
  116 + c.Response(data, err)
  117 +}
  118 +
  119 +// 功过看板 月榜
  120 +func (c *ProductTroubleController) RewardSummaryPublicNoticeMonth() {
  121 + srv := service.NewProductTroubleService(nil)
  122 + operater := ParseOperateInfo(c.BaseController)
  123 + data, err := srv.RewardSummaryPublicNoticeMonth(operater)
  124 + c.Response(data, err)
  125 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/web/beego"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/command"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/query"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/rewardStandard/service"
  8 +)
  9 +
  10 +type RewardStandardController struct {
  11 + beego.BaseController
  12 +}
  13 +
  14 +// 创建奖惩标准
  15 +func (c *RewardStandardController) CreatedRewardStandard() {
  16 + srv := service.NewRewardStandardService(nil)
  17 + createCommand := &command.SaveRewardStandardCommand{}
  18 + Must(c.Unmarshal(createCommand))
  19 + operater := ParseOperateInfo(c.BaseController)
  20 + data, err := srv.SaveRewardStandard(operater, createCommand)
  21 + c.Response(data, err)
  22 +}
  23 +
  24 +// 更新奖惩标准
  25 +func (c *RewardStandardController) UpdateRewardStandard() {
  26 + srv := service.NewRewardStandardService(nil)
  27 + createCommand := &command.SaveRewardStandardCommand{}
  28 + Must(c.Unmarshal(createCommand))
  29 + id, _ := c.GetInt(":id")
  30 + createCommand.Id = id
  31 + operater := ParseOperateInfo(c.BaseController)
  32 + data, err := srv.SaveRewardStandard(operater, createCommand)
  33 + c.Response(data, err)
  34 +}
  35 +
  36 +// 获取奖惩标准
  37 +func (c *RewardStandardController) GetRewardStandard() {
  38 + srv := service.NewRewardStandardService(nil)
  39 + id, _ := c.GetInt(":id")
  40 + getQuery := &query.GetRewardStandard{
  41 + Id: id,
  42 + }
  43 + operater := ParseOperateInfo(c.BaseController)
  44 + data, err := srv.GetRewardStandard(operater, getQuery)
  45 + c.Response(data, err)
  46 +}
  47 +
  48 +// 删除奖惩标准
  49 +func (c *RewardStandardController) DeleteRewardStandard() {
  50 + srv := service.NewRewardStandardService(nil)
  51 + getQuery := &query.GetRewardStandard{}
  52 + Must(c.Unmarshal(getQuery))
  53 + operater := ParseOperateInfo(c.BaseController)
  54 + data, err := srv.DeleteRewardStandard(operater, getQuery)
  55 + c.Response(data, err)
  56 +}
  57 +
  58 +// 列表展示奖惩标准
  59 +func (c *RewardStandardController) ListRewardStandard() {
  60 + srv := service.NewRewardStandardService(nil)
  61 + cmd := &query.ListRewardStandard{}
  62 + Must(c.Unmarshal(cmd))
  63 + operateInfo := ParseOperateInfo(c.BaseController)
  64 + cmd.CompanyId = operateInfo.CompanyId
  65 + total, data, err := srv.ListRewardStandard(cmd)
  66 + ResponseGrid(c.BaseController, total, data, err)
  67 +}
  68 +
  69 +// SaveRewardRule 保存奖惩规则
  70 +func (c *RewardStandardController) SaveRewardRule() {
  71 + srv := service.NewRewardStandardService(nil)
  72 + createCommand := &command.SaveRewardRuleCommand{}
  73 + Must(c.Unmarshal(createCommand))
  74 + operater := ParseOperateInfo(c.BaseController)
  75 + data, err := srv.SaveRewardRule(operater, createCommand)
  76 + c.Response(data, err)
  77 +}
  78 +
  79 +// GetRewardRule 获取奖惩规则
  80 +func (c *RewardStandardController) GetRewardRule() {
  81 + srv := service.NewRewardStandardService(nil)
  82 + operater := ParseOperateInfo(c.BaseController)
  83 + data, err := srv.GetRewardRule(operater)
  84 + c.Response(data, err)
  85 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + web.Router("/workshop-public-notice/workshop", &controllers.BoardDataController{}, "Get:WorkshopDesc")
  10 + web.Router("/workshop-public-notice/employee/workpiece-ratio", &controllers.BoardDataController{}, "Get:EmployeeWorkpieceRatio")
  11 + web.Router("/workshop-public-notice/section-product-info", &controllers.BoardDataController{}, "Get:TimeSectionProductRecord")
  12 + web.Router("/workshop-public-notice/proportion-of-second-level", &controllers.BoardDataController{}, "Get:ProportionOfSecondLevel")
  13 + web.Router("/workshop-public-notice/top-show", &controllers.BoardDataController{}, "Get:TopShow")
  14 + web.Router("/workshop-public-notice/product_plan", &controllers.BoardDataController{}, "Get:ProductPlan")
  15 + web.Router("/workshop-public-notice/workshop-plan-completion/current", &controllers.BoardDataController{}, "Get:WorkshopPlanCompletionCurrent")
  16 + web.Router("/workshop-public-notice/workshop-plan-completion/5day", &controllers.BoardDataController{}, "Get:WorkshopPlanCompletion5Day")
  17 +}
@@ -9,4 +9,5 @@ func init() { @@ -9,4 +9,5 @@ func init() {
9 web.Router("/file-import", &controllers.ExcelDataController{}, "Post:FileImport") 9 web.Router("/file-import", &controllers.ExcelDataController{}, "Post:FileImport")
10 web.Router("/file-export", &controllers.ExcelDataController{}, "Post:FileExport") 10 web.Router("/file-export", &controllers.ExcelDataController{}, "Post:FileExport")
11 web.Router("/file-import-template/:code", &controllers.ExcelDataController{}, "Get:FileImportTemplate") 11 web.Router("/file-import-template/:code", &controllers.ExcelDataController{}, "Get:FileImportTemplate")
  12 +
12 } 13 }
@@ -18,4 +18,19 @@ func init() { @@ -18,4 +18,19 @@ func init() {
18 web.Router("/product-records/cancel", &controllers.ProductRecordController{}, "Post:CancelProductRecord") 18 web.Router("/product-records/cancel", &controllers.ProductRecordController{}, "Post:CancelProductRecord")
19 web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord") 19 web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord")
20 web.Router("/product-records/workshop-productive/search", &controllers.ProductRecordController{}, "Post:SearchWorkshopProductRecord") 20 web.Router("/product-records/workshop-productive/search", &controllers.ProductRecordController{}, "Post:SearchWorkshopProductRecord")
  21 +
  22 + //产能管理 列表
  23 + web.Router("/product-records/product-capacities/search", &controllers.ProductRecordController{}, "Post:ListProductCapacities")
  24 + //产能管理 添加产能
  25 + web.Router("/product-records/product-capacities", &controllers.ProductRecordController{}, "Post:CreateProductCapacities")
  26 + //产能管理 编辑产能
  27 + web.Router("/product-records/product-capacities/:productRecordId", &controllers.ProductRecordController{}, "Put:UpdateProductCapacities")
  28 + //产能管理 列表-产能详情
  29 + web.Router("/product-records/product-capacities/:productRecordId", &controllers.ProductRecordController{}, "Get:GetProductCapacities")
  30 + //产能管理 列表 -删除产能
  31 + web.Router("/product-records/product-capacities/:productRecordId", &controllers.ProductRecordController{}, "Delete:DeleteProductCapacities")
  32 +
  33 + //产能管理 列表 -审核产能
  34 + web.Router("/product-records/product-capacities/approve", &controllers.ProductRecordController{}, "Post:ApproveProductCapacities")
  35 +
21 } 36 }
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + web.Router("/product_trouble/", &controllers.ProductTroubleController{}, "Post:CreatedProductTrouble")
  10 + web.Router("/product_trouble/:id", &controllers.ProductTroubleController{}, "Put:UpdateProductTrouble")
  11 + web.Router("/product_trouble/:id", &controllers.ProductTroubleController{}, "Get:GetProductTrouble")
  12 + web.Router("/product_trouble/remove", &controllers.ProductTroubleController{}, "Post:DeleteProductTrouble")
  13 + web.Router("/product_trouble/search", &controllers.ProductTroubleController{}, "Post:ListProductTrouble")
  14 + web.Router("/product_trouble/approve", &controllers.ProductTroubleController{}, "Post:ApproveProductTrouble")
  15 + web.Router("/product_trouble/reward_summary/seach", &controllers.ProductTroubleController{}, "Post:ListRewardSummary")
  16 + web.Router("/reward-summary/public-notice/day", &controllers.ProductTroubleController{}, "Get:RewardSummaryPublicNoticeDay")
  17 + web.Router("/reward-summary/public-notice/yield", &controllers.ProductTroubleController{}, "Get:RewardSummaryPublicNoticeYield")
  18 + web.Router("/reward-summary/public-notice/up-to-standard", &controllers.ProductTroubleController{}, "Get:RewardSummaryPublicNoticeUpToStandard")
  19 + web.Router("/reward-summary/public-notice/accident", &controllers.ProductTroubleController{}, "Get:RewardSummaryPublicNoticeAccident")
  20 + web.Router("/reward-summary/public-notice/month", &controllers.ProductTroubleController{}, "Get:RewardSummaryPublicNoticeMonth")
  21 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + web.Router("/reward-standard/", &controllers.RewardStandardController{}, "Post:CreatedRewardStandard")
  10 + web.Router("/reward-standard/:id", &controllers.RewardStandardController{}, "Put:UpdateRewardStandard")
  11 + web.Router("/reward-standard/:id", &controllers.RewardStandardController{}, "Get:GetRewardStandard")
  12 + web.Router("/reward-standard/remove", &controllers.RewardStandardController{}, "Post:DeleteRewardStandard")
  13 + web.Router("/reward-standard/search", &controllers.RewardStandardController{}, "Post:ListRewardStandard")
  14 + web.Router("/reward-rule/", &controllers.RewardStandardController{}, "Post:SaveRewardRule")
  15 + web.Router("/reward-rule/", &controllers.RewardStandardController{}, "Get:GetRewardRule")
  16 +}