合并分支 'test' 到 'dev_liujunxiong'
Test 查看合并请求 !11
正在显示
62 个修改的文件
包含
4234 行增加
和
111 行删除
.vscode/launch.json
0 → 100644
| 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 |  | 96 |  |
| 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 |
| 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 command |
| 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 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 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 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 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 | +} |
pkg/application/statistics/service/board.go
0 → 100644
| 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 | // 批号 |
pkg/domain/product_trouble.go
0 → 100644
| 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 | +} |
pkg/domain/reward_rule.go
0 → 100644
| 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 | +} |
pkg/domain/reward_standard.go
0 → 100644
| 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 | +} |
pkg/domain/reward_summary.go
0 → 100644
| 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 | +} |
-
请 注册 或 登录 后发表评论