Task.go 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597
  1. package Task
  2. import (
  3. "ColdVerify_server/conf"
  4. "ColdVerify_server/lib"
  5. "ColdVerify_server/logs"
  6. "ColdVerify_server/models/InfoCollection"
  7. "encoding/json"
  8. "errors"
  9. "fmt"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/astaxie/beego/cache"
  14. "github.com/beego/beego/v2/adapter/orm"
  15. orm2 "github.com/beego/beego/v2/client/orm"
  16. _ "github.com/go-sql-driver/mysql"
  17. )
  18. var (
  19. TaskSchemeStateWaitSubmit = 0 // 待提交
  20. TaskSchemeStateSubmitted = 5 // 已提交
  21. TaskSchemeStateClientPass = 1 // 已通过(客户)
  22. TaskSchemeStateClientReturn = 2 // 已退回(客户)
  23. TaskSchemeStatePass = 3 // 已通过(负责人)
  24. TaskSchemeStateReturn = 4 // 已退回(负责人)
  25. TaskSchemeStateMap = map[int]string{
  26. TaskSchemeStateWaitSubmit: "待提交",
  27. TaskSchemeStateSubmitted: "已提交",
  28. TaskSchemeStateClientPass: "已通过(客户)",
  29. TaskSchemeStateClientReturn: "已驳回(客户)",
  30. TaskSchemeStatePass: "已通过",
  31. TaskSchemeStateReturn: "已退回",
  32. }
  33. // 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(报告负责人) 6已退回(报告负责人)
  34. TaskCollectionStateWaitSubmit = 0 // 待提交
  35. TaskCollectionStateFinish = 1 // 已完成
  36. TaskCollectionStateInProgress = 2 // 处理中
  37. TaskCollectionStateNoData = 3 // 已采集-无数据
  38. TaskCollectionStateSubmitted = 4 // 已提交
  39. TaskCollectionStatePass = 5 // 已通过(负责人)
  40. TaskCollectionStateReturn = 6 // 已退回(负责人)
  41. TaskCollectionStateMap = map[int]string{
  42. TaskCollectionStateWaitSubmit: "待提交",
  43. TaskCollectionStateFinish: "已完成",
  44. TaskCollectionStateInProgress: "处理中",
  45. TaskCollectionStateNoData: "已采集-无数据",
  46. TaskCollectionStateSubmitted: "APP已提交",
  47. TaskCollectionStatePass: "已通过",
  48. TaskCollectionStateReturn: "已退回",
  49. }
  50. TaskReportingStateWaitSubmit = 0 // 待提交
  51. TaskReportingStateSubmitted = 5 // 已提交
  52. TaskReportingStateClientPass = 1 // 已通过(客户)
  53. TaskReportingStateClientReturn = 2 // 已退回(客户)
  54. TaskReportingStatePass = 3 // 已通过
  55. TaskReportingStateReturn = 4 // 已退回
  56. TaskReportingStateMap = map[int]string{
  57. TaskReportingStateWaitSubmit: "待提交",
  58. TaskReportingStateSubmitted: "已提交",
  59. TaskReportingStateClientPass: "已通过(客户)",
  60. TaskReportingStateClientReturn: "已驳回(客户)",
  61. TaskReportingStatePass: "已通过",
  62. TaskReportingStateReturn: "已退回",
  63. }
  64. TaskExaminingReportStateWaitSubmit = 0 // 待提交
  65. TaskExaminingReportStateSubmitted = 5 // 已提交
  66. TaskExaminingReportStateClientPass = 1 // 已通过(客户)
  67. TaskExaminingReportStateClientReturn = 2 // 已退回(客户)
  68. TaskExaminingReportStatePass = 3 // 已通过
  69. TaskExaminingReportStateReturn = 4 // 已退回
  70. TaskExaminingReportStateClickGenerate = 6 // 已退回
  71. TaskExaminingReportStateMap = map[int]string{
  72. TaskExaminingReportStateWaitSubmit: "待提交",
  73. TaskExaminingReportStateSubmitted: "已提交",
  74. TaskExaminingReportStateClientPass: "已通过(客户)",
  75. TaskExaminingReportStateClientReturn: "已驳回(客户)",
  76. TaskExaminingReportStatePass: "已通过",
  77. TaskExaminingReportStateReturn: "已退回",
  78. TaskExaminingReportStateClickGenerate: "已点击报告生成",
  79. }
  80. TaskOriginalRecordStateWaitSubmit = 0 // 待提交
  81. TaskOriginalRecordStateSubmitted = 5 // 已提交
  82. TaskOriginalRecordStatePass = 3 // 已通过
  83. TaskOriginalRecordStateReturn = 4 // 已退回
  84. TaskOriginalRecordStateMap = map[int]string{
  85. TaskOriginalRecordStateWaitSubmit: "待提交",
  86. TaskOriginalRecordStateSubmitted: "已提交",
  87. TaskOriginalRecordStatePass: "已通过",
  88. TaskOriginalRecordStateReturn: "已退回",
  89. }
  90. TaskDeliveryStateUnfinished = 0 // 未完成
  91. TaskDeliveryStateFinished = 1 // 已完成
  92. TaskDeliveryStateGoing = 2 // 进行中
  93. TaskDeliveryStateMap = map[int]string{
  94. TaskDeliveryStateUnfinished: "未完成",
  95. TaskDeliveryStateFinished: "已完成",
  96. TaskDeliveryStateGoing: "处理中",
  97. }
  98. TaskMarkingStateUnfinished = 0 // 未完成
  99. TaskMarkingStateFinished = 1 // 已完成
  100. TaskMarkingStateMap = map[int]string{
  101. TaskMarkingStateUnfinished: "未完成",
  102. TaskMarkingStateFinished: "已完成",
  103. }
  104. )
  105. var (
  106. TaskSchemeTimeLimit = map[string]float64{
  107. "BWX": 30, // 保温箱
  108. "LDX": 30, // 冷冻箱
  109. "LCG": 30, // 冷藏柜
  110. "LDG": 30, // 冷冻柜
  111. "YLG": 30, // 阴凉柜
  112. "LDC": 60, // 冷藏车
  113. "LK": 60, // 冷库
  114. "BG": 60, // 冰柜
  115. "DWBWX": 60, // 低温保存箱
  116. "XT": 30, // 系统验证
  117. "WZ": 80, // 位置
  118. "XJ": 0, // 巡检
  119. "PX": 0, // 培训
  120. "QT": 0, // 其他
  121. }
  122. TaskReportingTimeLimit = map[string]float64{
  123. "BWX": 180, // 保温箱
  124. "LDX": 180, // 冷冻箱
  125. "LCG": 210, // 冷藏柜
  126. "LDG": 210, // 冷冻柜
  127. "YLG": 210, // 阴凉柜
  128. "LDC": 300, // 冷藏车
  129. "LK": 390, // 冷库
  130. "BG": 210, // 冰柜
  131. "DWBWX": 180, // 低温保存箱
  132. "XT": 300, // 系统验证
  133. "WZ": 240, // 位置
  134. "XJ": 0, // 巡检
  135. "PX": 0, // 培训
  136. "QT": 0, // 其他
  137. }
  138. TaskCollectionTimeLimit float64 = 7 * 24 * 60
  139. DeviceTypeMap = map[string]string{
  140. "箱": "X",
  141. "柜": "G",
  142. "车": "C",
  143. "库": "K",
  144. "系统": "XT",
  145. "位置": "WZ",
  146. "培训": "PX",
  147. "巡检": "XJ",
  148. "其他": "QT",
  149. }
  150. )
  151. type AuditRecord struct {
  152. T_uuid string `orm:"size(256);null"` // 提交人(客户)UUID
  153. T_uuid_name string `orm:"size(256);null"` // 提交人名称
  154. T_admin string `orm:"size(256);null"` // 提交人(报告负责人)UUID
  155. T_admin_name string `orm:"size(256);null"` // 提交人名称
  156. T_state int `orm:"size(2);default(0)"` // 状态 1 已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交
  157. T_reason string `orm:"type(text)"` // 原因
  158. T_time string `orm:"type(256)"` // 时间
  159. T_type string `orm:"type(256)"` // 退回类型 scheme方案 reporting报告
  160. }
  161. // 模版
  162. type Task struct {
  163. Id int `orm:"column(ID);size(11);auto;pk"`
  164. T_uid string `orm:"size(256);null"` // 文件导入任务的唯一标识
  165. T_Distributor_id string `orm:"size(256);null"` // 分销商id
  166. T_class int `orm:"size(200);default(0)"` // 分类id
  167. T_InfoCollection_id string `orm:"size(256);null"` // 信息采集ID
  168. T_InfoTemplate_id string `orm:"size(256);null"` // 信息采集模版ID
  169. T_task_id string `orm:"size(256);null"` // 任务ID
  170. T_uuid string `orm:"size(256);null"` // 用户 UUID
  171. T_name string `orm:"size(256);null"` // 标题
  172. T_VerifyTemplate_class string `orm:"size(256);null"` // 模版id
  173. T_VerifyTemplate_id string `orm:"size(256);null"` // 模版id
  174. T_deadline string `orm:"size(256);null"` // 截止时间
  175. T_scheme string `orm:"size(256);null"` // 实施方案 负责人UUID
  176. T_collection string `orm:"size(256);null"` // 数据采集 负责人UUID
  177. T_reporting string `orm:"size(256);null"` // 报告编写 负责人UUID
  178. T_delivery string `orm:"size(256);null"` // 交付审核 负责人UUID
  179. T_scheme_state int `orm:"size(2);default(0)"` // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交 10 必填项已填写
  180. T_collection_state int `orm:"size(2);default(0)"` // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4 APP已提交 5已通过(负责人) 6已退回(负责人)
  181. T_reporting_state int `orm:"size(2);default(0)"` // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交 6已点报告生成 10 必填项已填写
  182. T_delivery_state int `orm:"size(2);default(0)"` // 交付审核 状态 0 未完成 1 已完成 2 处理中
  183. T_marking_state int `orm:"size(2);default(0)"` // 验证标识 状态 0 未完成 1 已完成
  184. T_examining_report_state int `orm:"size(2);default(0)"` // 检测报告 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交 10 必填项已填写
  185. T_original_record_state int `orm:"size(2);default(0)"` // 原始记录 状态 0 未完成 3 已通过(负责人) 4已退回(负责人) 5已提交 10 必填项已填写
  186. T_record string `orm:"type(text);null"` // 领导备注
  187. T_collection_submit_time string `orm:"size(256);null"` // 数据采集 提交时间
  188. T_reporting_submit_time string `orm:"size(256);null"` // 报告编写 提交时间
  189. T_VerifyDeviceDataStartTime string `orm:"size(256);null"` // 验证设备数据开始时间
  190. T_VerifyDeviceDataEndTime string `orm:"size(256);null"` // 验证设备数据结束时间
  191. T_BindDeviceDataStartTime string `orm:"size(256);null"` // 绑定设备数据开始时间
  192. T_BindDeviceDataEndTime string `orm:"size(256);null"` // 绑定设备数据结束时间
  193. T_doc1 string `orm:"type(text);null"` // 封面
  194. T_pdf1 string `orm:"type(text);null"` // 验证方案
  195. T_pdf1_watermark string `orm:"type(text);null"` // 验证方案 带水印
  196. T_pdf1_signature string `orm:"type(text);null"` // 验证方案 带公章
  197. T_pdf1_elec_signature string `orm:"type(text);null"` // 验证方案 带电子签名及公章
  198. T_doc2 string `orm:"type(text);null"` // 报告
  199. T_pdf2 string `orm:"type(text);null"` // 验证报告
  200. T_pdf2_watermark string `orm:"type(text);null"` // 验证报告 带水印
  201. T_pdf2_signature string `orm:"type(text);null"` // 验证报告 带公章
  202. T_pdf2_elec_signature string `orm:"type(text);null"` // 验证报告 带电子签名及公章
  203. T_doc3 string `orm:"type(text);null"` // 证书
  204. T_pdf3 string `orm:"type(text);null"` // 证书
  205. T_pdf4 string `orm:"type(text);null"` // 验证标识
  206. T_pdf5 string `orm:"type(text);null"` // 检测报告
  207. T_pdf5_watermark string `orm:"type(text);null"` // 检测报告 带水印
  208. T_pdf6 string `orm:"type(text);null"` // 原始记录
  209. T_Show int `orm:"size(2);default(1)"` // 0 隐藏 1 公开
  210. T_Visit int `orm:"size(200);default(0)"` // 浏览量
  211. T_State int `orm:"size(2);default(1)"` // 0 删除 1 正常
  212. T_step int `orm:"size(2);default(-1)"` // 验证步骤
  213. T_sn string `orm:"size(256);null"` // sn
  214. T_CalibrationExpirationTime string `orm:"size(256);null"` // 校准到期时间
  215. T_project string `orm:"size(256);null"` // 项目 负责人UUID
  216. T_province string `orm:"size(256);null"` // 省
  217. T_city string `orm:"size(256);null"` // 市
  218. T_district string `orm:"size(256);null"` // 区
  219. T_province_code string `orm:"size(256);null"` // 省 code
  220. T_city_code string `orm:"size(256);null"` // 市 code
  221. T_district_code string `orm:"size(256);null"` // 区 code
  222. T_category string `orm:"size(256);null"` // 类别
  223. T_device_type string `orm:"size(256);null"` // 设备类型
  224. T_volume string `orm:"size(256);null"` // 规格/容积
  225. T_verify_type string `orm:"size(256);null"` // 验证类型
  226. T_subject_matter string `orm:"size(256);null"` // 标的物名称
  227. T_temp_range string `orm:"size(256);null"` // 验证温度范围
  228. T_report_number string `orm:"size(256);null"` // 报告编号
  229. T_report_type string `orm:"size(256);null"` // 报告类型
  230. T_belong_year string `orm:"size(256);null"` // 所属年份
  231. T_start_time string `orm:"size(256);null"` // 项目开始时间
  232. T_end_time string `orm:"size(256);null"` // 结束时间 报告审核通过时间
  233. T_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  234. T_reject_times int `orm:"size(256);null"` // 驳回次数 客户退回方案和报告时
  235. T_reject_record string `orm:"type(text);null"` // 驳回记录
  236. // 方案
  237. T_scheme_start_time string `orm:"size(256);null"` // 验证方案开始时间 接收信息采集表的时间
  238. T_scheme_end_time string `orm:"size(256);null"` // 验证方案结束时间 负责人审核通过后最后一次上传时间
  239. T_scheme_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  240. T_scheme_overtime float64 `orm:"size(256);null"` // 验证方案超时时间 单位分钟
  241. T_scheme_signature string `orm:"type(text);null"` // 验证方案客户签字确认图片
  242. T_scheme_return_times int `orm:"size(256);null"` // 验证方案退回次数
  243. T_scheme_audit_record string `orm:"type(text);null"` // 验证方案审核记录
  244. // 实施
  245. T_enter_area_time string `orm:"size(256);null"` // 进场时间
  246. T_collection_start_time string `orm:"size(256);null"` // 实施开始时间(app开始验证时间)
  247. T_collection_end_time string `orm:"size(256);null"` // 实施结束时间 (审核通过后签字确认提交时间)
  248. T_collection_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  249. T_collection_overtime float64 `orm:"size(256);null"` // 实施超时时间 单位分钟
  250. T_collection_signature string `orm:"type(text);null"` // 实施人员签字确认图片
  251. T_collection_return_times int `orm:"size(256);null"` // 实施方案退回次数
  252. T_collection_audit_record string `orm:"type(text);null"` // 实施方案审核记录
  253. // 报告
  254. T_reporting_start_time string `orm:"size(256);null"` // 验证报告开始时间 接收信息采集表的时间
  255. T_reporting_end_time string `orm:"size(256);null"` // 验证报告结束时间 负责人审核通过前最后一次上传时间
  256. T_reporting_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  257. T_reporting_overtime float64 `orm:"size(256);null"` // 验证报告超时时间 单位分钟
  258. T_reporting_signature string `orm:"type(text);null"` // 验证报告客户签字确认图片
  259. T_reporting_return_times int `orm:"size(256);null"` // 验证报告退回次数
  260. T_reporting_audit_record string `orm:"type(text);null"` // 验证报告审核记录
  261. T_reporting_pass_time string `orm:"size(256);null"` // 验证报告负责人通过时间
  262. // 检测报告
  263. T_examining_report_start_time string `orm:"size(256);null"` // 检测报告开始时间 接收信息采集表的时间
  264. T_examining_report_end_time string `orm:"size(256);null"` // 检测报告结束时间 负责人审核通过前最后一次上传时间
  265. T_examining_report_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  266. T_examining_report_signature string `orm:"type(text);null"` // 检测报告客户签字确认图片
  267. T_examining_report_return_times int `orm:"size(256);null"` // 检测报告退回次数
  268. T_examining_report_audit_record string `orm:"type(text);null"` // 检测报告审核记录
  269. // 原始记录
  270. T_original_record_start_time string `orm:"size(256);null"` // 原始记录开始时间 接收信息采集表的时间
  271. T_original_record_end_time string `orm:"size(256);null"` // 原始记录结束时间 负责人审核通过前最后一次上传时间
  272. T_original_record_time_interval float64 `orm:"size(256);null"` // 时间间隔 单位分钟
  273. T_original_record_signature string `orm:"type(text);null"` // 原始记录客户签字确认图片
  274. T_original_record_return_times int `orm:"size(256);null"` // 原始记录退回次数
  275. T_original_record_audit_record string `orm:"type(text);null"` // 原始记录审核记录
  276. T_device_quantity int `orm:"size(20);default(0)"` // 终端数量 T_device_type=WZ 必填
  277. T_cnas int `orm:"size(256);default(0)"` // 0-否 1-是
  278. T_cover int `orm:"size(20);default(0)"` // 是否覆盖询问
  279. T_backup string `orm:"size(256);null"` // 历史数据记录
  280. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
  281. UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新
  282. }
  283. type Task_ struct {
  284. Id int
  285. T_Distributor_id string // 信息采集ID
  286. T_class int // 分类ID
  287. T_InfoCollection_id string // 信息采集ID
  288. T_task_id string // 任务ID
  289. T_uuid string // 用户 UUID
  290. T_user_name string // 用户 UUID
  291. T_name string // 标题
  292. T_VerifyTemplate_class string // 任务模版id
  293. T_VerifyTemplate_id string // 任务模版id
  294. T_deadline string // 截止时间
  295. T_scheme string // 实施方案 负责人UUID
  296. T_collection string // 数据采集 负责人UUID
  297. T_reporting string // 报告编写 负责人UUID
  298. T_delivery string // 交付审核 负责人UUID
  299. T_scheme_state int // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  300. T_collection_state int // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  301. T_reporting_state int // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  302. T_delivery_state int // 交付审核 状态 0 未完成 1 已完成 2 处理中
  303. T_marking_state int // 验证标识 状态 0 未完成 1 已完成
  304. T_examining_report_state int // 检测报告 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  305. T_original_record_state int // 原始记录 状态 0 未完成 3 已通过(负责人) 4已退回(负责人) 5已提交
  306. T_scheme_state_str string // 实施方案 状态 字符串
  307. T_collection_state_str string // 数据采集 状态 字符串
  308. T_reporting_state_str string // 报告编写 状态 字符串
  309. T_delivery_state_str string // 交付审核 状态 字符串
  310. T_marking_state_str string // 验证标识 状态 字符串
  311. T_examining_report_state_str string // 检测报告 状态 字符串
  312. T_original_record_state_str string // 原始记录 状态 字符串
  313. T_scheme_name string // 实施方案 负责人姓名
  314. T_collection_name string // 数据采集 负责人姓名
  315. T_reporting_name string // 报告编写 负责人姓名
  316. T_delivery_name string // 交付审核 负责人姓名
  317. T_VerifyDeviceDataStartTime string
  318. T_VerifyDeviceDataEndTime string
  319. T_VerifyDeviceDataTime [2]string // 验证设备数据开始-结束时间
  320. T_BindDeviceDataTime [2]string // 绑定设备数据开始-结束时间
  321. T_doc1 string // 封面
  322. T_pdf1 string // 验证方案
  323. T_pdf1_signature string // 验证方案 带公章
  324. T_doc2 string // 报告
  325. T_pdf2 string // 报告
  326. T_pdf2_signature string // 报告 带公章
  327. T_doc3 string // 证书
  328. T_pdf3 string // 证书
  329. T_pdf4 string // 验证标识
  330. T_pdf5 string // 检测报告
  331. T_Show int // 0 公开 1 隐藏
  332. T_Visit int // 浏览量
  333. T_State int // 0 删除 1 正常
  334. T_sn string // sn
  335. T_CalibrationExpirationTime string // 校准到期时间
  336. T_project string // 项目 负责人UUID
  337. T_project_name string // 项目 负责人姓名
  338. T_province string // 省
  339. T_city string // 市
  340. T_district string // 区
  341. T_area []string // 省市区
  342. T_province_code string // 省 code
  343. T_city_code string // 市 code
  344. T_district_code string // 区 code
  345. T_area_code []string // 省市区
  346. InfoCollection InfoCollection.InfoCollection //信息采集
  347. T_record string //
  348. T_device_type string
  349. T_verify_type string
  350. T_reporting_pass_time string
  351. T_device_quantity int
  352. T_cnas int // cnas实验室
  353. T_cover int // 是否覆盖询问
  354. T_backup string // 历史数据记录
  355. }
  356. type Task_Stat struct {
  357. Id int
  358. T_Distributor_id string // 信息采集ID
  359. T_class int // 分类ID
  360. T_InfoCollection_id string // 信息采集ID
  361. T_InfoTemplate_id string // 信息采集模版ID
  362. T_task_id string // 任务ID
  363. T_uuid string // 用户 UUID
  364. T_user_name string // 用户 UUID
  365. T_name string // 标题
  366. T_VerifyTemplate_class string // 任务模版id
  367. T_VerifyTemplate_id string // 任务模版id
  368. T_deadline string // 截止时间
  369. T_scheme string // 实施方案 负责人UUID
  370. T_collection string // 数据采集 负责人UUID
  371. T_reporting string // 报告编写 负责人UUID
  372. T_delivery string // 交付审核 负责人UUID
  373. T_scheme_state int // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  374. T_collection_state int // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  375. T_reporting_state int // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  376. T_delivery_state int // 交付审核 状态 0 未完成 1 已完成 2 处理中
  377. T_marking_state int // 验证标识 状态 0 未完成 1 已完成
  378. T_scheme_state_str string // 实施方案 状态 字符串
  379. T_collection_state_str string // 数据采集 状态 字符串
  380. T_reporting_state_str string // 报告编写 状态 字符串
  381. T_delivery_state_str string // 交付审核 状态 字符串
  382. T_marking_state_str string // 验证标识 状态 字符串
  383. T_examining_report_state_str string // 检测报告 状态 字符串
  384. T_original_record_state_str string // 原始记录 状态 字符串
  385. T_scheme_name string // 实施方案 负责人姓名
  386. T_collection_name string // 数据采集 负责人姓名
  387. T_reporting_name string // 报告编写 负责人姓名
  388. T_delivery_name string // 交付审核 负责人姓名
  389. T_VerifyDeviceDataTime [2]string // 验证设备数据开始-结束时间
  390. T_BindDeviceDataTime [2]string // 绑定设备数据开始-结束时间
  391. T_doc1 string // 封面
  392. T_pdf1 string // 验证方案
  393. T_doc2 string // 报告
  394. T_pdf2 string // 报告
  395. T_doc3 string // 证书
  396. T_pdf3 string // 证书
  397. T_pdf4 string // 验证标识
  398. T_Show int // 0 公开 1 隐藏
  399. T_Visit int // 浏览量
  400. T_State int // 0 删除 1 正常
  401. T_sn string // sn
  402. T_CalibrationExpirationTime string // 校准到期时间
  403. T_project string // 项目 负责人UUID
  404. T_project_name string // 项目 负责人姓名
  405. T_province string // 省
  406. T_city string // 市
  407. T_district string // 区
  408. T_area []string // 省市区
  409. T_province_code string // 省 code
  410. T_city_code string // 市 code
  411. T_district_code string // 区 code
  412. T_area_code []string // 省市区
  413. T_category string // 类别
  414. T_device_type string // 设备类型
  415. T_volume string // 规格/容积
  416. T_verify_type string // 验证类型
  417. T_subject_matter string // 标的物名称
  418. T_temp_range string // 验证温度范围
  419. T_report_number string // 报告编号
  420. T_report_type string // 报告类型
  421. T_start_time string // 项目开始时间
  422. T_end_time string // 结束时间 报告审核通过时间
  423. T_time_interval string // 时间间隔 单位分钟
  424. T_reject_times int // 驳回次数 客户退回方案和报告时
  425. T_reject_record string // 驳回记录
  426. // 方案
  427. T_scheme_start_time string // 验证方案开始时间 接收信息采集表的时间
  428. T_scheme_end_time string // 验证方案结束时间
  429. T_scheme_time_interval string // 时间间隔 单位分钟
  430. T_scheme_overtime string // 验证方案超时时间 单位分钟
  431. T_scheme_signature string // 验证方案客户签字确认图片
  432. T_scheme_return_times int // 验证方案退回次数
  433. T_scheme_audit_record string // 验证方案审核记录
  434. // 实施
  435. T_enter_area_time string // 进场时间
  436. T_collection_start_time string // 实施开始时间(app开始验证时间)
  437. T_collection_end_time string // 实施结束时间 (签字确认提交时间)
  438. T_collection_time_interval string // 时间间隔 单位分钟
  439. T_collection_overtime string // 实施超时时间 单位分钟
  440. T_collection_signature string // 实施人员签字确认图片
  441. T_collection_return_times int // 实施方案退回次数
  442. T_collection_audit_record string // 实施方案审核记录
  443. // 报告
  444. T_reporting_start_time string // 验证报告开始时间 接收信息采集表的时间
  445. T_reporting_end_time string // 验证报告结束时间
  446. T_reporting_time_interval string // 时间间隔 单位分钟
  447. T_reporting_overtime string // 验证报告超时时间 单位分钟
  448. T_reporting_signature string // 验证报告客户签字确认图片
  449. T_reporting_return_times int // 验证报告退回次数
  450. T_reporting_audit_record string // 验证报告审核记录
  451. InfoCollection InfoCollection.InfoCollection_R //信息菜鸡
  452. T_record string //
  453. T_device_quantity int
  454. T_cnas int // cnas实验室
  455. T_cover int // 是否覆盖询问
  456. T_backup string // 历史数据记录
  457. }
  458. func (t *Task) TableName() string {
  459. return "task" // 数据库名称 // ************** 替换 FormulaList **************
  460. }
  461. var redisCache_Task cache.Cache
  462. func init() {
  463. //注册模型
  464. orm.RegisterModel(new(Task))
  465. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  466. "redis_"+"Task", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  467. logs.Println(config)
  468. var err error
  469. redisCache_Task, err = cache.NewCache("redis", config)
  470. if err != nil || redisCache_Task == nil {
  471. errMsg := "failed to init redis"
  472. logs.Println(errMsg, err)
  473. }
  474. }
  475. // -------------------------------------------------------------
  476. // selectPdf 根据条件选择PDF文件
  477. // 返回选中的PDF和signature PDF
  478. func selectPdf(watermark, original, signature, elecSignature string, isReturnedMoney bool, hasInfoCollection bool) (selectedPdf, selectedSignature string) {
  479. // 默认使用watermark版本
  480. selectedPdf = watermark
  481. // 如果满足以下任一条件,使用原始版本:退款状态、无InfoCollection、watermark为空
  482. if isReturnedMoney || !hasInfoCollection || len(watermark) == 0 {
  483. selectedPdf = original
  484. // 如果是退款状态,优先选择签名版本(电子签名优先于普通签名)
  485. if isReturnedMoney {
  486. if len(elecSignature) > 0 {
  487. selectedPdf = elecSignature
  488. } else if len(signature) > 0 {
  489. selectedPdf = signature
  490. }
  491. }
  492. }
  493. // 设置signature,如果为空则使用原始版本
  494. selectedSignature = signature
  495. if len(selectedSignature) == 0 {
  496. selectedSignature = original
  497. }
  498. return selectedPdf, selectedSignature
  499. }
  500. func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
  501. T_.Id = T.Id
  502. T_.T_Distributor_id = T.T_Distributor_id
  503. T_.T_class = T.T_class
  504. T_.T_InfoCollection_id = T.T_InfoCollection_id
  505. if len(T.T_InfoCollection_id) > 0 {
  506. T_.InfoCollection, _ = InfoCollection.Read_InfoCollection(T.T_InfoCollection_id)
  507. }
  508. T_.T_task_id = T.T_task_id
  509. T_.T_uuid = T.T_uuid
  510. T_.T_user_name = userMap[T.T_uuid]
  511. T_.T_name = T.T_name
  512. T_.T_VerifyTemplate_class = T.T_VerifyTemplate_class
  513. T_.T_VerifyTemplate_id = T.T_VerifyTemplate_id
  514. T_.T_deadline = T.T_deadline
  515. T_.T_scheme = T.T_scheme
  516. T_.T_collection = T.T_collection
  517. T_.T_reporting = T.T_reporting
  518. T_.T_delivery = T.T_delivery
  519. T_.T_project = T.T_project
  520. T_.T_scheme_state = T.T_scheme_state
  521. T_.T_collection_state = T.T_collection_state
  522. T_.T_reporting_state = T.T_reporting_state
  523. T_.T_delivery_state = T.T_delivery_state
  524. T_.T_marking_state = T.T_marking_state
  525. T_.T_examining_report_state = T.T_examining_report_state
  526. T_.T_original_record_state = T.T_original_record_state
  527. T_.T_scheme_state_str = TaskSchemeStateMap[T.T_scheme_state]
  528. T_.T_collection_state_str = TaskCollectionStateMap[T.T_collection_state]
  529. T_.T_reporting_state_str = TaskReportingStateMap[T.T_reporting_state]
  530. T_.T_delivery_state_str = TaskDeliveryStateMap[T.T_delivery_state]
  531. T_.T_marking_state_str = TaskMarkingStateMap[T.T_marking_state]
  532. T_.T_examining_report_state_str = TaskExaminingReportStateMap[T.T_examining_report_state]
  533. T_.T_original_record_state_str = TaskOriginalRecordStateMap[T.T_original_record_state]
  534. T_.T_scheme_name = adminMap[T.T_scheme]
  535. T_.T_collection_name = adminMap[T.T_collection]
  536. T_.T_reporting_name = adminMap[T.T_reporting]
  537. T_.T_delivery_name = adminMap[T.T_delivery]
  538. T_.T_project_name = adminMap[T.T_project]
  539. T_.T_VerifyDeviceDataStartTime = T.T_VerifyDeviceDataStartTime
  540. T_.T_VerifyDeviceDataEndTime = T.T_VerifyDeviceDataEndTime
  541. T_.T_VerifyDeviceDataTime = [2]string{T.T_VerifyDeviceDataStartTime, T.T_VerifyDeviceDataEndTime}
  542. T_.T_BindDeviceDataTime = [2]string{T.T_BindDeviceDataStartTime, T.T_BindDeviceDataEndTime}
  543. T_.T_doc1 = T.T_doc1
  544. T_.T_doc2 = T.T_doc2
  545. T_.T_doc3 = T.T_doc3
  546. // 处理PDF1和PDF2的选择逻辑
  547. isReturnedMoney := T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney
  548. hasInfoCollection := len(T.T_InfoCollection_id) > 0
  549. T_.T_pdf1, T_.T_pdf1_signature = selectPdf(
  550. T.T_pdf1_watermark,
  551. T.T_pdf1,
  552. T.T_pdf1_signature,
  553. T.T_pdf1_elec_signature,
  554. isReturnedMoney,
  555. hasInfoCollection,
  556. )
  557. T_.T_pdf2, T_.T_pdf2_signature = selectPdf(
  558. T.T_pdf2_watermark,
  559. T.T_pdf2,
  560. T.T_pdf2_signature,
  561. T.T_pdf2_elec_signature,
  562. isReturnedMoney,
  563. hasInfoCollection,
  564. )
  565. T_.T_pdf3 = T.T_pdf3
  566. T_.T_pdf4 = T.T_pdf4
  567. T_.T_pdf5 = T.T_pdf5_watermark
  568. if T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney || len(T.T_InfoCollection_id) == 0 || len(T.T_pdf2_watermark) == 0 {
  569. }
  570. T_.T_Show = T.T_Show
  571. T_.T_Visit = T.T_Visit
  572. T_.T_State = T.T_State
  573. T_.T_sn = T.T_sn
  574. T_.T_CalibrationExpirationTime = T.T_CalibrationExpirationTime
  575. T_.T_record = T.T_record
  576. T_.T_device_type = T.T_device_type
  577. T_.T_verify_type = T.T_verify_type
  578. T_.T_reporting_pass_time = T.T_reporting_pass_time
  579. T_.T_device_quantity = T.T_device_quantity
  580. T_.T_cnas = T.T_cnas
  581. T_.T_cover = T.T_cover
  582. T_.T_backup = T.T_backup
  583. return T_
  584. }
  585. func TaskToTask_Stat(T Task, userMap, adminMap map[string]string) (T_ Task_Stat) {
  586. T_.Id = T.Id
  587. T_.T_Distributor_id = T.T_Distributor_id
  588. T_.T_class = T.T_class
  589. T_.T_InfoCollection_id = T.T_InfoCollection_id
  590. if len(T.T_InfoCollection_id) > 0 {
  591. infoCollection, _ := InfoCollection.Read_InfoCollection(T.T_InfoCollection_id)
  592. T_.InfoCollection = InfoCollection.InfoCollectionToInfoCollection_R(infoCollection, userMap, adminMap, map[string]string{}, map[string]string{})
  593. }
  594. T_.T_task_id = T.T_task_id
  595. T_.T_uuid = T.T_uuid
  596. T_.T_user_name = userMap[T.T_uuid]
  597. T_.T_name = T.T_name
  598. T_.T_VerifyTemplate_class = T.T_VerifyTemplate_class
  599. T_.T_VerifyTemplate_id = T.T_VerifyTemplate_id
  600. T_.T_deadline = T.T_deadline
  601. T_.T_scheme = T.T_scheme
  602. T_.T_collection = T.T_collection
  603. T_.T_reporting = T.T_reporting
  604. T_.T_delivery = T.T_delivery
  605. T_.T_scheme_state = T.T_scheme_state
  606. T_.T_collection_state = T.T_collection_state
  607. T_.T_reporting_state = T.T_reporting_state
  608. T_.T_delivery_state = T.T_delivery_state
  609. T_.T_marking_state = T.T_marking_state
  610. T_.T_scheme_state_str = TaskSchemeStateMap[T.T_scheme_state]
  611. T_.T_collection_state_str = TaskCollectionStateMap[T.T_collection_state]
  612. T_.T_reporting_state_str = TaskReportingStateMap[T.T_reporting_state]
  613. T_.T_delivery_state_str = TaskDeliveryStateMap[T.T_delivery_state]
  614. T_.T_marking_state_str = TaskMarkingStateMap[T.T_marking_state]
  615. T_.T_examining_report_state_str = TaskExaminingReportStateMap[T.T_examining_report_state]
  616. T_.T_original_record_state_str = TaskOriginalRecordStateMap[T.T_original_record_state]
  617. T_.T_project_name = adminMap[T.T_project]
  618. T_.T_scheme_name = adminMap[T.T_scheme]
  619. T_.T_collection_name = adminMap[T.T_collection]
  620. T_.T_reporting_name = adminMap[T.T_reporting]
  621. T_.T_delivery_name = adminMap[T.T_delivery]
  622. T_.T_VerifyDeviceDataTime = [2]string{T.T_VerifyDeviceDataStartTime, T.T_VerifyDeviceDataEndTime}
  623. T_.T_BindDeviceDataTime = [2]string{T.T_BindDeviceDataStartTime, T.T_BindDeviceDataEndTime}
  624. T_.T_doc1 = T.T_doc1
  625. T_.T_doc2 = T.T_doc2
  626. T_.T_doc3 = T.T_doc3
  627. T_.T_pdf1 = T.T_pdf1_watermark
  628. if T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney || len(T.T_InfoCollection_id) == 0 || len(T.T_pdf1_watermark) == 0 {
  629. T_.T_pdf1 = T.T_pdf1
  630. }
  631. T_.T_pdf2 = T.T_pdf2_watermark
  632. if T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney || len(T.T_InfoCollection_id) == 0 || len(T.T_pdf2_watermark) == 0 {
  633. T_.T_pdf2 = T.T_pdf2
  634. }
  635. T_.T_pdf3 = T.T_pdf3
  636. T_.T_pdf4 = T.T_pdf4
  637. T_.T_Show = T.T_Show
  638. T_.T_Visit = T.T_Visit
  639. T_.T_State = T.T_State
  640. T_.T_sn = T.T_sn
  641. T_.T_CalibrationExpirationTime = T.T_CalibrationExpirationTime
  642. T_.T_project = T.T_project
  643. T_.T_province = T.T_province
  644. T_.T_city = T.T_city
  645. T_.T_district = T.T_district
  646. T_.T_area = []string{T.T_province, T.T_city, T.T_district}
  647. T_.T_province_code = T.T_province_code
  648. T_.T_city_code = T.T_city_code
  649. T_.T_district_code = T.T_district_code
  650. T_.T_area_code = []string{T.T_province_code, T.T_city_code, T.T_district_code}
  651. T_.T_category = T.T_category
  652. T_.T_device_type = T.T_device_type
  653. T_.T_volume = T.T_volume
  654. T_.T_verify_type = T.T_verify_type
  655. T_.T_subject_matter = T.T_subject_matter
  656. T_.T_temp_range = T.T_temp_range
  657. T_.T_report_number = T.T_report_number
  658. T_.T_report_type = T.T_report_type
  659. T_.T_start_time = T.T_start_time
  660. T_.T_end_time = T.T_end_time
  661. T_.T_time_interval = lib.ConvertMinutesToDHM(int(T.T_time_interval))
  662. T_.T_reject_times = T.T_reject_times
  663. T_.T_reject_record = T.T_reject_record
  664. // 方案
  665. T_.T_scheme_start_time = T.T_scheme_start_time
  666. T_.T_scheme_end_time = T.T_scheme_end_time
  667. if T.T_scheme_state == TaskSchemeStateSubmitted ||
  668. T.T_scheme_state == TaskSchemeStateClientPass ||
  669. T.T_scheme_state == TaskSchemeStatePass {
  670. T_.T_scheme_time_interval = lib.ConvertMinutesToDHM(int(T.T_scheme_time_interval))
  671. T_.T_scheme_overtime = lib.ConvertMinutesToDHM(int(T.T_scheme_overtime))
  672. }
  673. T_.T_scheme_signature = T.T_scheme_signature
  674. T_.T_scheme_return_times = T.T_scheme_return_times
  675. T_.T_scheme_audit_record = T.T_scheme_audit_record
  676. // 实施
  677. T_.T_enter_area_time = T.T_enter_area_time
  678. T_.T_collection_start_time = T.T_collection_start_time
  679. T_.T_collection_end_time = T.T_collection_end_time
  680. if T.T_collection_state == TaskCollectionStatePass ||
  681. T.T_collection_state == TaskCollectionStateSubmitted {
  682. T_.T_collection_time_interval = lib.ConvertMinutesToDHM(int(T.T_collection_time_interval))
  683. T_.T_collection_overtime = lib.ConvertMinutesToDHM(int(T.T_collection_overtime))
  684. }
  685. T_.T_collection_signature = T.T_collection_signature
  686. T_.T_collection_return_times = T.T_collection_return_times
  687. T_.T_collection_audit_record = T.T_collection_audit_record
  688. // 报告
  689. T_.T_reporting_start_time = T.T_reporting_start_time
  690. T_.T_reporting_end_time = T.T_reporting_end_time
  691. if T.T_reporting_state == TaskReportingStateClientPass ||
  692. T.T_reporting_state == TaskReportingStateSubmitted ||
  693. T.T_reporting_state == TaskReportingStateClientReturn ||
  694. T.T_reporting_state == TaskReportingStatePass {
  695. T_.T_reporting_time_interval = lib.ConvertMinutesToDHM(int(T.T_reporting_time_interval))
  696. T_.T_reporting_overtime = lib.ConvertMinutesToDHM(int(T.T_reporting_overtime))
  697. }
  698. T_.T_reporting_signature = T.T_reporting_signature
  699. T_.T_reporting_return_times = T.T_reporting_return_times
  700. T_.T_reporting_audit_record = T.T_reporting_audit_record
  701. T_.T_record = T.T_record
  702. T_.T_device_quantity = T.T_device_quantity
  703. T_.T_cnas = T.T_cnas
  704. T_.T_cover = T.T_cover
  705. T_.T_backup = T.T_backup
  706. return T_
  707. }
  708. // ---------------- Redis -------------------
  709. func Redis_Task_Set(key string, r Task) (err error) {
  710. //json序列化
  711. str, err := json.Marshal(r)
  712. if err != nil {
  713. logs.Error(lib.FuncName(), err)
  714. return
  715. }
  716. err = redisCache_Task.Put(key, str, 24*time.Hour)
  717. if err != nil {
  718. logs.Println("set key:", key, ",value:", str, err)
  719. }
  720. return
  721. }
  722. func Redis_Task_Get(key string) (r Task, is bool) {
  723. if redisCache_Task.IsExist(key) {
  724. logs.Println("找到key:", key)
  725. v := redisCache_Task.Get(key)
  726. json.Unmarshal(v.([]byte), &r)
  727. return r, true
  728. }
  729. logs.Println("没有 找到key:", key)
  730. return Task{}, false
  731. }
  732. func Redis_Task_DelK(key string) (err error) {
  733. err = redisCache_Task.Delete(key)
  734. return
  735. }
  736. func Redis_Task_T_report_number_Set(key string) (err error) {
  737. err = redisCache_Task.Put(key, "", 24*time.Hour)
  738. if err != nil {
  739. logs.Println("set key:", key)
  740. }
  741. return
  742. }
  743. func Redis_Task_T_report_number_Get(key string) (is bool) {
  744. if redisCache_Task.IsExist(key) {
  745. return true
  746. }
  747. logs.Println("没有 找到key:", key)
  748. return false
  749. }
  750. func Redis_Task_T_report_number_DelK(key string) (err error) {
  751. err = redisCache_Task.Delete(key)
  752. return
  753. }
  754. // ---------------- 特殊方法 -------------------
  755. // 获取 ById
  756. func Read_Task_ById(id int) (r Task, is bool) {
  757. o := orm.NewOrm()
  758. r = Task{Id: id}
  759. err := o.Read(&r) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  760. if err != nil {
  761. logs.Error(lib.FuncName(), err)
  762. return r, false
  763. }
  764. return r, true
  765. }
  766. // 获取 By
  767. func Read_Task(T_task_id string) (r Task, is bool) {
  768. if r, is = Redis_Task_Get(T_task_id); is == true {
  769. return r, true
  770. }
  771. o := orm.NewOrm()
  772. qs := o.QueryTable(new(Task))
  773. //err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
  774. err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
  775. if err != nil {
  776. return r, false
  777. }
  778. Redis_Task_Set(T_task_id, r)
  779. return r, true
  780. }
  781. // 批量获取任务
  782. func Read_Task_List_By_TaskIds(taskIds []string) ([]Task, error) {
  783. cleanIds := make([]string, 0, len(taskIds))
  784. seen := make(map[string]struct{}, len(taskIds))
  785. for _, id := range taskIds {
  786. id = strings.TrimSpace(id)
  787. if len(id) == 0 {
  788. continue
  789. }
  790. if _, ok := seen[id]; ok {
  791. continue
  792. }
  793. seen[id] = struct{}{}
  794. cleanIds = append(cleanIds, id)
  795. }
  796. if len(cleanIds) == 0 {
  797. return []Task{}, nil
  798. }
  799. o := orm.NewOrm()
  800. var tasks []Task
  801. _, err := o.QueryTable(new(Task)).Filter("T_task_id__in", cleanIds).Filter("T_State", 1).All(&tasks)
  802. if err != nil {
  803. logs.Error(lib.FuncName(), err)
  804. return nil, err
  805. }
  806. return tasks, nil
  807. }
  808. // 获取 By T_uid
  809. func Read_Task_ByUid(T_uid string) (r Task, is bool) {
  810. o := orm.NewOrm()
  811. qs := o.QueryTable(new(Task))
  812. err := qs.Filter("T_uid", T_uid).Filter("T_State", 1).One(&r)
  813. if err != nil {
  814. return r, false
  815. }
  816. return r, true
  817. }
  818. // 获取 By T_class
  819. func Read_Task_ByT_class(T_class int) (r Task, is bool) {
  820. o := orm.NewOrm()
  821. qs := o.QueryTable(new(Task))
  822. err := qs.Filter("T_class", T_class).Filter("T_State", 1).One(&r)
  823. if err != nil {
  824. return r, false
  825. }
  826. return r, true
  827. }
  828. // 添加
  829. func Add_Task(r Task) (string, bool) {
  830. o := orm.NewOrm()
  831. // 生成编号
  832. rand_x := 0
  833. for true {
  834. r.T_task_id = lib.GetRandstring(12, "abcdefghijklmnopqrstuvwxyz0123456789", int64(rand_x)) // 1,336,336
  835. err := o.Read(&r, "T_task_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  836. if err != nil {
  837. break
  838. }
  839. rand_x += 1
  840. }
  841. _, err := o.Insert(&r)
  842. if err != nil {
  843. logs.Error(lib.FuncName(), err)
  844. return "", false
  845. }
  846. if !CREATE_TaskData(r.T_task_id) {
  847. return "", false
  848. }
  849. Redis_Task_Set(r.T_task_id, r)
  850. return r.T_task_id, true
  851. }
  852. func Add_Task_Tool(r Task) (string, bool) {
  853. o := orm.NewOrm()
  854. _, err := o.Insert(&r)
  855. if err != nil {
  856. logs.Error(lib.FuncName(), err)
  857. return "", false
  858. }
  859. return r.T_task_id, true
  860. }
  861. // 删除
  862. func Delete_Task(v Task) bool {
  863. o := orm.NewOrm()
  864. if num, err := o.Delete(&v); err == nil {
  865. logs.Println("Number of records deleted in database:", num)
  866. } else {
  867. logs.Error(lib.FuncName(), err)
  868. return false
  869. }
  870. Redis_Task_DelK(v.T_task_id)
  871. return true
  872. }
  873. // 删除
  874. func Delete_Task_(v Task) bool {
  875. o := orm.NewOrm()
  876. v.T_State = 0
  877. if num, err := o.Update(&v, "T_State"); err == nil {
  878. logs.Println("Number of records updated in database:", num)
  879. } else {
  880. logs.Error(lib.FuncName(), err)
  881. return false
  882. }
  883. Redis_Task_DelK(v.T_task_id)
  884. return true
  885. }
  886. // 修改
  887. func Update_Task(m Task, cols ...string) bool {
  888. o := orm.NewOrm()
  889. if num, err := o.Update(&m, cols...); err == nil {
  890. logs.Println("Number of records updated in database:", num)
  891. Redis_Task_Set(m.T_task_id, m)
  892. return true
  893. } else {
  894. logs.Error(lib.FuncName(), err)
  895. }
  896. return false
  897. }
  898. // 添加浏览量
  899. func Add_Task_Visit(m Task) bool {
  900. o := orm.NewOrm()
  901. m.T_Visit += 1
  902. if num, err := o.Update(&m, "T_Visit"); err == nil {
  903. logs.Println("Number of records updated in database:", num)
  904. Redis_Task_Set(m.T_task_id, m)
  905. return true
  906. } else {
  907. logs.Error(lib.FuncName(), err)
  908. }
  909. return false
  910. }
  911. // 获取用户任务列表
  912. func Read_Task_List_All() ([]Task, int) {
  913. o := orm.NewOrm()
  914. qs := o.QueryTable(new(Task))
  915. var r []Task
  916. cond := orm.NewCondition()
  917. //cond1 := cond.And("T_name__icontains", T_name).And("T_State", 1)
  918. cond1 := cond.And("T_State", 1)
  919. qs.Limit(10, 0).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  920. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  921. return r, int(cnt)
  922. }
  923. // 获取用户任务列表
  924. func Read_UserTask_List(T_uuid string, T_name string, userMap, adminMap map[string]string, page int, page_z int) ([]Task_, int) {
  925. o := orm.NewOrm()
  926. qs := o.QueryTable(new(Task))
  927. var r []Task
  928. var offset int64
  929. if page <= 1 {
  930. offset = 0
  931. } else {
  932. offset = int64((page - 1) * page_z)
  933. }
  934. cond := orm.NewCondition()
  935. cond1 := cond.And("T_name__icontains", T_name).And("T_Show", 1).And("T_State", 1)
  936. if len(T_uuid) > 0 {
  937. cond1 = cond1.And("T_uuid", T_uuid)
  938. }
  939. qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  940. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  941. // 转换
  942. var TaskList []Task_
  943. for _, v := range r {
  944. TaskList = append(TaskList, TaskToTask_(v, userMap, adminMap))
  945. }
  946. return TaskList, int(cnt)
  947. }
  948. // 获取任务列表
  949. func Read_Task_List(T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id string, T_scheme, T_collection, T_reporting, T_delivery,
  950. T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state string,
  951. T_company_list []string, userMap, adminMap map[string]string, CreateTime string, page int, page_z int) ([]Task_, int) {
  952. o := orm.NewOrm()
  953. qs := o.QueryTable(new(Task))
  954. var r []Task
  955. var offset int64
  956. if page <= 1 {
  957. offset = 0
  958. } else {
  959. offset = int64((page - 1) * page_z)
  960. }
  961. cond := orm.NewCondition()
  962. cond1 := cond.AndCond(cond.Or("T_name__icontains", T_name).Or("T_task_id__icontains", T_name)).And("T_State", 1)
  963. if len(T_uuid) > 0 {
  964. cond1 = cond1.And("T_uuid", T_uuid)
  965. }
  966. if len(T_Distributor_id) > 0 {
  967. cond1 = cond1.And("T_Distributor_id", T_Distributor_id)
  968. }
  969. if len(T_InfoCollection_id) > 0 {
  970. cond1 = cond1.And("T_InfoCollection_id", T_InfoCollection_id)
  971. }
  972. if len(T_admin) > 0 {
  973. cond1 = cond1.AndCond(cond.Or("T_scheme", T_admin).Or("T_collection", T_admin).
  974. Or("T_reporting", T_admin).Or("T_delivery", T_admin))
  975. }
  976. if len(T_company_list) > 0 {
  977. cond1 = cond1.And("T_uuid__in", T_company_list)
  978. }
  979. if len(T_scheme) > 0 {
  980. cond1 = cond1.And("T_scheme", T_scheme)
  981. }
  982. if len(T_collection) > 0 {
  983. cond1 = cond1.And("T_collection", T_collection)
  984. }
  985. if len(T_reporting) > 0 {
  986. cond1 = cond1.And("T_reporting", T_reporting)
  987. }
  988. if len(T_delivery) > 0 {
  989. cond1 = cond1.And("T_delivery", T_delivery)
  990. }
  991. if len(T_scheme_state) > 0 {
  992. cond1 = cond1.And("T_scheme_state", T_scheme_state)
  993. }
  994. if len(T_collection_state) > 0 {
  995. cond1 = cond1.And("T_collection_state", T_collection_state)
  996. }
  997. if len(T_reporting_state) > 0 {
  998. cond1 = cond1.And("T_reporting_state", T_reporting_state)
  999. }
  1000. if len(T_delivery_state) > 0 {
  1001. cond1 = cond1.And("T_delivery_state", T_delivery_state)
  1002. }
  1003. if len(T_marking_state) > 0 {
  1004. cond1 = cond1.And("T_marking_state", T_marking_state)
  1005. }
  1006. if len(CreateTime) > 0 {
  1007. CreateTime_s := strings.Split(CreateTime, "-")
  1008. if len(CreateTime_s) == 2 {
  1009. // 定义开始和结束时间
  1010. start := time.Date(lib.To_int(CreateTime_s[0]), time.Month(lib.To_int(CreateTime_s[1])), 1, 0, 0, 0, 0, time.UTC)
  1011. end := start.AddDate(0, 1, 0) // 下个月的第一天
  1012. logs.Println("CreateTime_s:", start.Format("2006-01-02 15:04:05"), end.Format("2006-01-02 15:04:05"))
  1013. cond1 = cond1.And("CreateTime__gte", start).And("CreateTime__lt", end)
  1014. }
  1015. }
  1016. qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1017. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1018. // 转换
  1019. var TaskList []Task_
  1020. for _, v := range r {
  1021. TaskList = append(TaskList, TaskToTask_(v, userMap, adminMap))
  1022. }
  1023. return TaskList, int(cnt)
  1024. }
  1025. func Read_Task_BySN(sn string) (r Task, err error) {
  1026. if task, is := Redis_Task_Get(sn); is == true {
  1027. return task, nil
  1028. }
  1029. o := orm.NewOrm()
  1030. qs := o.QueryTable(new(Task))
  1031. err = qs.Filter("T_sn", sn).Filter("T_State", 1).One(&r)
  1032. if err != nil {
  1033. return r, err
  1034. }
  1035. Redis_Task_Set(sn, r)
  1036. return r, nil
  1037. }
  1038. // 修改
  1039. func Update_Task_T_InfoTemplate_id(T_InfoCollection_id, T_InfoTemplate_id string) error {
  1040. o := orm.NewOrm()
  1041. qs := o.QueryTable(new(Task))
  1042. var r []Task
  1043. o.Begin()
  1044. qs.Filter("T_InfoCollection_id", T_InfoCollection_id).All(&r)
  1045. for _, task := range r {
  1046. task.T_InfoTemplate_id = T_InfoTemplate_id
  1047. if _, err := o.Update(&task, "T_InfoTemplate_id"); err == nil {
  1048. Redis_Task_Set(task.T_task_id, task)
  1049. } else {
  1050. o.Rollback()
  1051. logs.Error(lib.FuncName(), err)
  1052. return err
  1053. }
  1054. }
  1055. o.Commit()
  1056. return nil
  1057. }
  1058. func Add_AuditRecord(T_audit_record string, T_uuid, T_admin string, T_scheme_state int, T_reason string, T_type string) (string, error) {
  1059. auditRecord := AuditRecord{
  1060. T_uuid: T_uuid,
  1061. T_admin: T_admin,
  1062. T_state: T_scheme_state,
  1063. T_reason: T_reason,
  1064. T_type: T_type,
  1065. T_time: time.Now().Format("2006-01-02 15:04:05"),
  1066. }
  1067. var returnRecordList []AuditRecord
  1068. if len(T_audit_record) > 0 {
  1069. err := json.Unmarshal([]byte(T_audit_record), &returnRecordList)
  1070. if err != nil {
  1071. logs.Error("JSON 反序列化失败:", err)
  1072. return "", errors.New("JSON 反序列化失败")
  1073. }
  1074. }
  1075. returnRecordList = append(returnRecordList, auditRecord)
  1076. returnRecordJson, err := json.Marshal(returnRecordList)
  1077. if err != nil {
  1078. logs.Error("JSON 反序列化失败:", err)
  1079. return "", errors.New("JSON 反序列化失败")
  1080. }
  1081. return string(returnRecordJson), nil
  1082. }
  1083. // 获取项目负责人列表
  1084. func Get_Task_UserList(T_type string) []string {
  1085. o := orm.NewOrm()
  1086. var err error
  1087. var pl_lists []string
  1088. switch T_type {
  1089. case "T_project":
  1090. _, err = o.Raw("SELECT DISTINCT t_project FROM task LIMIT 0,1000").QueryRows(&pl_lists)
  1091. case "T_scheme":
  1092. _, err = o.Raw("SELECT DISTINCT t_scheme FROM task LIMIT 0,1000").QueryRows(&pl_lists)
  1093. case "T_collection":
  1094. _, err = o.Raw("SELECT DISTINCT t_collection FROM task LIMIT 0,1000").QueryRows(&pl_lists)
  1095. case "T_reporting":
  1096. _, err = o.Raw("SELECT DISTINCT t_reporting FROM task LIMIT 0,1000").QueryRows(&pl_lists)
  1097. }
  1098. if err != nil {
  1099. logs.Error("获取项目负责人列表失败:", err)
  1100. }
  1101. return pl_lists
  1102. }
  1103. func Read_Task_Stat(T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id string, T_project, T_scheme, T_collection, T_reporting, T_delivery,
  1104. T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state string,
  1105. T_company_list []string, userMap, adminMap map[string]string, CreateTime string, page int, page_z int) ([]Task_Stat, int) {
  1106. o := orm.NewOrm()
  1107. qs := o.QueryTable(new(Task))
  1108. var r []Task
  1109. var offset int64
  1110. if page <= 1 {
  1111. offset = 0
  1112. } else {
  1113. offset = int64((page - 1) * page_z)
  1114. }
  1115. cond := orm.NewCondition()
  1116. cond1 := cond.AndCond(cond.Or("T_name__icontains", T_name).Or("T_task_id__icontains", T_name)).And("T_State", 1)
  1117. if len(T_uuid) > 0 {
  1118. cond1 = cond1.And("T_uuid", T_uuid)
  1119. }
  1120. if len(T_Distributor_id) > 0 {
  1121. cond1 = cond1.And("T_Distributor_id", T_Distributor_id)
  1122. }
  1123. if len(T_InfoCollection_id) > 0 {
  1124. cond1 = cond1.And("T_InfoCollection_id", T_InfoCollection_id)
  1125. }
  1126. if len(T_admin) > 0 {
  1127. cond1 = cond1.AndCond(cond.Or("T_scheme", T_admin).Or("T_collection", T_admin).
  1128. Or("T_reporting", T_admin).Or("T_delivery", T_admin))
  1129. }
  1130. if len(T_company_list) > 0 {
  1131. cond1 = cond1.And("T_uuid__in", T_company_list)
  1132. }
  1133. if len(T_project) > 0 {
  1134. cond1 = cond1.And("T_project", T_project)
  1135. }
  1136. if len(T_scheme) > 0 {
  1137. cond1 = cond1.And("T_scheme", T_scheme)
  1138. }
  1139. if len(T_collection) > 0 {
  1140. cond1 = cond1.And("T_collection", T_collection)
  1141. }
  1142. if len(T_reporting) > 0 {
  1143. cond1 = cond1.And("T_reporting", T_reporting)
  1144. }
  1145. if len(T_delivery) > 0 {
  1146. cond1 = cond1.And("T_delivery", T_delivery)
  1147. }
  1148. if len(T_scheme_state) > 0 {
  1149. cond1 = cond1.And("T_scheme_state", T_scheme_state)
  1150. }
  1151. if len(T_collection_state) > 0 {
  1152. cond1 = cond1.And("T_collection_state", T_collection_state)
  1153. }
  1154. if len(T_reporting_state) > 0 {
  1155. cond1 = cond1.And("T_reporting_state", T_reporting_state)
  1156. }
  1157. if len(T_delivery_state) > 0 {
  1158. cond1 = cond1.And("T_delivery_state", T_delivery_state)
  1159. }
  1160. if len(T_marking_state) > 0 {
  1161. cond1 = cond1.And("T_marking_state", T_marking_state)
  1162. }
  1163. if len(CreateTime) > 0 {
  1164. CreateTime_s := strings.Split(CreateTime, "-")
  1165. if len(CreateTime_s) == 2 {
  1166. // 定义开始和结束时间
  1167. start := time.Date(lib.To_int(CreateTime_s[0]), time.Month(lib.To_int(CreateTime_s[1])), 1, 0, 0, 0, 0, time.UTC)
  1168. end := start.AddDate(0, 1, 0) // 下个月的第一天
  1169. logs.Println("CreateTime_s:", start.Format("2006-01-02 15:04:05"), end.Format("2006-01-02 15:04:05"))
  1170. cond1 = cond1.And("CreateTime__gte", start).And("CreateTime__lt", end)
  1171. }
  1172. }
  1173. if page_z == 9999 {
  1174. qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1175. } else {
  1176. qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1177. }
  1178. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1179. // 转换
  1180. var TaskList []Task_Stat
  1181. for _, v := range r {
  1182. TaskList = append(TaskList, TaskToTask_Stat(v, userMap, adminMap))
  1183. }
  1184. return TaskList, int(cnt)
  1185. }
  1186. // 获取用户任务列表
  1187. func Read_UserTask_StatisticalRanking(T_uuid, T_scheme string) []Task {
  1188. o := orm.NewOrm()
  1189. qs := o.QueryTable(new(Task))
  1190. var r []Task
  1191. cond := orm.NewCondition()
  1192. //cond_T_uuid := orm.NewCondition().Or("T_scheme", T_uuid).Or("T_collection", T_uuid).Or("T_reporting", T_uuid)
  1193. //cond1 := cond.And("T_name__icontains", T_name).And("T_State", 1)
  1194. cond1 := cond.And("T_State", 1).And(T_scheme, T_uuid)
  1195. qs.Limit(500, 0).SetCond((*orm2.Condition)(cond1)).OrderBy("-UpdateTime").All(&r)
  1196. qs.SetCond((*orm2.Condition)(cond1)).Count()
  1197. return r
  1198. }
  1199. // 获取任务列表
  1200. func Read_Task_List_For_ERP(start_time, end_time string) ([]Task_, int) {
  1201. o := orm.NewOrm()
  1202. qs := o.QueryTable(new(Task))
  1203. var r []Task
  1204. cond := orm.NewCondition()
  1205. cond1 := cond.And("T_State", 1).And("T_reporting_state", TaskReportingStatePass)
  1206. if len(start_time) > 0 {
  1207. cond1 = cond1.And("T_reporting_pass_time__gte", start_time)
  1208. }
  1209. if len(end_time) > 0 {
  1210. cond1 = cond1.And("T_reporting_pass_time__lte", end_time)
  1211. }
  1212. qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1213. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1214. // 转换
  1215. var TaskList []Task_
  1216. for _, v := range r {
  1217. TaskList = append(TaskList, TaskToTask_(v, map[string]string{}, map[string]string{}))
  1218. }
  1219. return TaskList, int(cnt)
  1220. }
  1221. // 获取任务列表
  1222. func Read_Task_List_For_ERP_By_Type(T_type string, start_time, end_time string) ([]Task_, int) {
  1223. o := orm.NewOrm()
  1224. qs := o.QueryTable(new(Task))
  1225. var r []Task
  1226. cond := orm.NewCondition()
  1227. cond1 := cond.And("T_State", 1)
  1228. if T_type == "collection" {
  1229. cond1 = cond1.And("T_collection_submit_time__gte", start_time).And("T_collection_submit_time__lte", end_time)
  1230. }
  1231. if T_type == "reporting" {
  1232. cond1 = cond1.And("T_reporting_submit_time__gte", start_time).And("T_reporting_submit_time__lte", end_time)
  1233. }
  1234. qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1235. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1236. // 转换
  1237. var TaskList []Task_
  1238. for _, v := range r {
  1239. TaskList = append(TaskList, TaskToTask_(v, map[string]string{}, map[string]string{}))
  1240. }
  1241. return TaskList, int(cnt)
  1242. }
  1243. // GenerateNextT_report_number 生成下一个编号
  1244. func GenerateNextT_report_number(T_device_type string) (string, error) {
  1245. o := orm.NewOrm()
  1246. // 获取当前年份和季度
  1247. currentYear := time.Now().Year()
  1248. currentQuarter := int(time.Now().Month()-1)/3 + 1 // 1,2,3,4 对应 A,B,C,D
  1249. quarterChar := string(rune('A' + currentQuarter - 1))
  1250. yearQuarter := fmt.Sprintf("%s%d%s", T_device_type, currentYear, quarterChar)
  1251. var lastRecord Task
  1252. err := o.QueryTable(new(Task)).
  1253. Filter("T_report_number__startswith", yearQuarter).
  1254. OrderBy("-T_report_number").
  1255. Limit(1).
  1256. One(&lastRecord)
  1257. if err != nil && err.Error() != orm.ErrNoRows.Error() {
  1258. return "", fmt.Errorf("报告编号-查询当前年季度最后编号失败: %v", err)
  1259. }
  1260. // 初始化新编号
  1261. var newSeq = 1
  1262. if lastRecord.T_report_number != "" {
  1263. // 提取序号部分,例如 "2025A00001" -> "00001"
  1264. lastSeqStr := lastRecord.T_report_number[len(lastRecord.T_report_number)-5:]
  1265. lastSeq, _ := strconv.Atoi(lastSeqStr)
  1266. newSeq = lastSeq + 1
  1267. }
  1268. var newCode string
  1269. for {
  1270. // 格式化新编号
  1271. newCode = fmt.Sprintf("%s%05d", yearQuarter, newSeq)
  1272. if Redis_Task_T_report_number_Get(newCode) {
  1273. newSeq += 1
  1274. } else {
  1275. err = Redis_Task_T_report_number_Set(newCode)
  1276. if err != nil {
  1277. return "", fmt.Errorf("报告编号-存入redis失败: %v", err)
  1278. }
  1279. break
  1280. }
  1281. }
  1282. return newCode, nil
  1283. }
  1284. // 获取 By
  1285. func Read_TaskbyT_report_number(T_report_number string) (r Task, is bool) {
  1286. o := orm.NewOrm()
  1287. qs := o.QueryTable(new(Task))
  1288. //err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
  1289. err := qs.Filter("T_report_number", T_report_number).Filter("T_State", 1).One(&r)
  1290. if err != nil {
  1291. return r, false
  1292. }
  1293. return r, true
  1294. }
  1295. func Read_Task_List_For_Watermark(pdfType string) ([]Task, int) {
  1296. o := orm.NewOrm()
  1297. qs := o.QueryTable(new(Task))
  1298. var r []Task
  1299. cond := orm.NewCondition()
  1300. if pdfType == "pdf1" {
  1301. cond = cond.And("T_State", 1).And("T_pdf1__icontains", ".pdf").And("t_pdf1_signature__isnull", true)
  1302. }
  1303. if pdfType == "pdf2" {
  1304. cond = cond.And("T_State", 1).And("T_pdf2__icontains", ".pdf").And("t_pdf2_signature__isnull", true)
  1305. }
  1306. qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&r)
  1307. cnt, _ := qs.SetCond((*orm2.Condition)(cond)).Count()
  1308. return r, int(cnt)
  1309. }
  1310. func Read_Task_List_By_T_InfoCollection_id(T_InfoCollection_id string) ([]Task, int) {
  1311. o := orm.NewOrm()
  1312. qs := o.QueryTable(new(Task))
  1313. var r []Task
  1314. cond := orm.NewCondition()
  1315. cond1 := cond.And("T_InfoCollection_id", T_InfoCollection_id).And("T_State", 1)
  1316. qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1317. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1318. return r, int(cnt)
  1319. }
  1320. // 删除的重复数据
  1321. func DeleteDeduplicate(T_task_id string) (int64, error) {
  1322. localOrm := orm.NewOrm()
  1323. tb_name := "z_task_data_" + T_task_id
  1324. var cnt int64
  1325. // 创建临时表
  1326. sqlCreate := "CREATE TABLE `tmp_table_" + T_task_id + "` AS (SELECT MIN(`ID`) AS `min_id` FROM " + tb_name + " GROUP BY `t_sn`,`t_id`,`t_time`);"
  1327. _, err := localOrm.Raw(sqlCreate).Exec()
  1328. if err != nil {
  1329. logs.Error(lib.FuncName(), err)
  1330. return cnt, err
  1331. }
  1332. sqlDelete := "DELETE FROM " + tb_name + " WHERE `ID` NOT IN (SELECT `min_id` FROM `tmp_table_" + T_task_id + "`);"
  1333. res, err := localOrm.Raw(sqlDelete).Exec()
  1334. if err != nil {
  1335. logs.Error(lib.FuncName(), err)
  1336. return cnt, err
  1337. }
  1338. cnt, _ = res.RowsAffected()
  1339. sqlDrop := "DROP TABLE `tmp_table_" + T_task_id + "`;"
  1340. _, err = localOrm.Raw(sqlDrop).Exec()
  1341. if err != nil {
  1342. logs.Error(lib.FuncName(), err)
  1343. return cnt, err
  1344. }
  1345. return cnt, nil
  1346. }
  1347. // 修正秒数
  1348. func CorrectionSecond(T_task_id string) error {
  1349. o := orm.NewOrm()
  1350. tb_name := "z_task_data_" + T_task_id
  1351. // 创建临时表
  1352. sqlCreate := "UPDATE " + tb_name + " SET t_time = t_time - INTERVAL SECOND(t_time) SECOND WHERE SECOND(t_time) != 0"
  1353. _, err := o.Raw(sqlCreate).Exec()
  1354. if err != nil {
  1355. logs.Error(lib.FuncName(), err)
  1356. return err
  1357. }
  1358. return nil
  1359. }
  1360. // 查询T_uuid匹配且T_InfoCollection_id为空的任务列表
  1361. func Read_Task_List_By_T_uuid_And_Empty_InfoCollection_id(T_uuid string) ([]Task, int) {
  1362. o := orm.NewOrm()
  1363. qs := o.QueryTable(new(Task))
  1364. var r []Task
  1365. cond := orm.NewCondition()
  1366. // 查询T_InfoCollection_id为NULL或空字符串
  1367. cond1 := cond.And("T_uuid", T_uuid).And("T_State", 1).AndCond(cond.Or("T_InfoCollection_id__isnull", true).Or("T_InfoCollection_id", ""))
  1368. qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
  1369. cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
  1370. return r, int(cnt)
  1371. }
  1372. // 批量更新任务的T_InfoCollection_id
  1373. func Update_Task_T_InfoCollection_id_By_T_uuid(T_uuid, T_InfoCollection_id string) error {
  1374. o := orm.NewOrm()
  1375. qs := o.QueryTable(new(Task))
  1376. var r []Task
  1377. o.Begin()
  1378. cond := orm.NewCondition()
  1379. cond1 := cond.And("T_uuid", T_uuid).And("T_State", 1).AndCond(cond.Or("T_InfoCollection_id__isnull", true).Or("T_InfoCollection_id", ""))
  1380. qs.SetCond((*orm2.Condition)(cond1)).All(&r)
  1381. for _, task := range r {
  1382. task.T_InfoCollection_id = T_InfoCollection_id
  1383. if _, err := o.Update(&task, "T_InfoCollection_id"); err == nil {
  1384. Redis_Task_Set(task.T_task_id, task)
  1385. } else {
  1386. o.Rollback()
  1387. logs.Error(lib.FuncName(), err)
  1388. return err
  1389. }
  1390. }
  1391. o.Commit()
  1392. return nil
  1393. }