Task.go 137 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958
  1. package controllers
  2. import (
  3. "ColdVerify_server/Nats/NatsServer"
  4. "ColdVerify_server/conf"
  5. "ColdVerify_server/lib"
  6. "ColdVerify_server/lib/wx"
  7. "ColdVerify_server/logs"
  8. "ColdVerify_server/models/Account"
  9. "ColdVerify_server/models/Certificate"
  10. "ColdVerify_server/models/Device"
  11. "ColdVerify_server/models/InfoCollection"
  12. "ColdVerify_server/models/System"
  13. "ColdVerify_server/models/Task"
  14. "ColdVerify_server/models/VerifyTemplate"
  15. "encoding/json"
  16. "errors"
  17. "fmt"
  18. "image/color"
  19. "math"
  20. "os"
  21. "os/exec"
  22. "strings"
  23. "sync"
  24. "time"
  25. beego "github.com/beego/beego/v2/server/web"
  26. "github.com/google/uuid"
  27. "github.com/xuri/excelize/v2"
  28. "gonum.org/v1/plot"
  29. "gonum.org/v1/plot/plotter"
  30. "gonum.org/v1/plot/vg"
  31. "gonum.org/v1/plot/vg/draw"
  32. )
  33. type TaskController struct {
  34. beego.Controller
  35. }
  36. // 导入Excel创建任务并写入模版数据
  37. func (c *TaskController) Import_Tasks() {
  38. file, _, err := c.GetFile("file")
  39. if err != nil {
  40. c.Data["json"] = lib.JSONS{Code: 203, Msg: "读取上传文件失败!"}
  41. c.ServeJSON()
  42. return
  43. }
  44. defer file.Close()
  45. xlsx, err := excelize.OpenReader(file)
  46. if err != nil {
  47. c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 文件解析失败!"}
  48. c.ServeJSON()
  49. return
  50. }
  51. defer func() {
  52. _ = xlsx.Close()
  53. }()
  54. sheetName := c.GetString("sheet")
  55. if len(sheetName) == 0 {
  56. sheets := xlsx.GetSheetList()
  57. if len(sheets) == 0 {
  58. c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 文件为空!"}
  59. c.ServeJSON()
  60. return
  61. }
  62. sheetName = sheets[0]
  63. }
  64. rows, err := xlsx.GetRows(sheetName)
  65. if err != nil {
  66. c.Data["json"] = lib.JSONS{Code: 203, Msg: "读取 Excel 内容失败!"}
  67. c.ServeJSON()
  68. return
  69. }
  70. if len(rows) < 2 {
  71. c.Data["json"] = lib.JSONS{Code: 203, Msg: "Excel 中缺少数据行!"}
  72. c.ServeJSON()
  73. return
  74. }
  75. headers := rows[0]
  76. successIDs := make([]string, 0)
  77. skippedRows := make([]int, 0)
  78. failedRows := make([]string, 0)
  79. for idx := 1; idx < len(rows); idx++ {
  80. rowCells := rows[idx]
  81. rowData := make(map[string]string, len(headers))
  82. nonEmpty := false
  83. for colIdx, header := range headers {
  84. header = strings.TrimSpace(header)
  85. if len(header) == 0 {
  86. continue
  87. }
  88. value := ""
  89. if colIdx < len(rowCells) {
  90. value = strings.TrimSpace(rowCells[colIdx])
  91. }
  92. if len(value) > 0 {
  93. nonEmpty = true
  94. }
  95. rowData[header] = value
  96. }
  97. if !nonEmpty {
  98. continue
  99. }
  100. companyName := strings.TrimSpace(rowData["公司名称"])
  101. taskName := strings.TrimSpace(rowData["任务名称"])
  102. if len(companyName) == 0 || len(taskName) == 0 {
  103. skippedRows = append(skippedRows, idx+1)
  104. continue
  105. }
  106. if rowData["布点图片"] == "" {
  107. skippedRows = append(skippedRows, idx+1)
  108. continue
  109. }
  110. taskID, err := c.importTaskRow(rowData)
  111. if err != nil {
  112. failedRows = append(failedRows, fmt.Sprintf("第%d行: %v", idx+1, err))
  113. continue
  114. }
  115. successIDs = append(successIDs, taskID)
  116. }
  117. msg := fmt.Sprintf("导入完成, 成功 %d 条, 跳过 %d 条, 失败 %d 条", len(successIDs), len(skippedRows), len(failedRows))
  118. respData := map[string]interface{}{
  119. "success_ids": successIDs,
  120. "skipped_rows": skippedRows,
  121. }
  122. if len(failedRows) > 0 {
  123. respData["failed_rows"] = failedRows
  124. }
  125. c.Data["json"] = lib.JSONS{Code: 200, Msg: msg, Data: respData}
  126. c.ServeJSON()
  127. }
  128. func (c *TaskController) importTaskRow(row map[string]string) (string, error) {
  129. templateName := strings.TrimSpace(row["模版名称"])
  130. lastOpenBracket := strings.LastIndex(templateName, "[")
  131. lastCloseBracket := strings.LastIndex(templateName, "]")
  132. if lastOpenBracket == -1 || lastCloseBracket == -1 || lastOpenBracket >= lastCloseBracket {
  133. return "", fmt.Errorf("模版名称中未找到模版ID")
  134. }
  135. templateID := templateName[lastOpenBracket+1 : lastCloseBracket]
  136. if len(templateID) == 0 {
  137. return "", fmt.Errorf("模版ID为空")
  138. }
  139. vt, ok := VerifyTemplate.Read_VerifyTemplate(templateID)
  140. if !ok {
  141. return "", fmt.Errorf("模版不存在: %s", templateID)
  142. }
  143. taskUID := strings.TrimSpace(row["唯一标识"])
  144. if len(taskUID) == 0 {
  145. return "", fmt.Errorf("唯一标识缺失")
  146. }
  147. existingTask, taskExists := Task.Read_Task_ByUid(taskUID)
  148. companyName := strings.TrimSpace(row["公司名称"])
  149. if len(companyName) == 0 {
  150. return "", fmt.Errorf("公司名称缺失")
  151. }
  152. cachedUser, found, err := Account.GetCompanyFromCache(companyName)
  153. if err != nil {
  154. return "", fmt.Errorf("公司数据读取失败: %w", err)
  155. }
  156. var user Account.User
  157. if !found {
  158. newUser := Account.User{
  159. T_name: companyName,
  160. T_pass: Account.DefaultCompanyPasswordHash,
  161. T_passstr: Account.DefaultCompanyPasswordPlain,
  162. T_Show: 1,
  163. T_State: 1,
  164. T_pid: 0,
  165. }
  166. newID, ok := Account.Add_User(newUser)
  167. if !ok {
  168. return "", fmt.Errorf("自动创建公司失败")
  169. }
  170. if err := Account.UpdateUserPath(int(newID)); err != nil {
  171. logs.Error("更新新公司路径失败:", err)
  172. }
  173. createdUser, is := Account.Read_User_ById(int(newID))
  174. if !is {
  175. return "", fmt.Errorf("获取新公司信息失败")
  176. }
  177. user = createdUser
  178. Account.UpsertCompanyCache(user)
  179. } else {
  180. user = cachedUser
  181. }
  182. resolveAdminUUID := func(fieldName, fallback string, strict bool) (string, error) {
  183. value, ok := row[fieldName]
  184. if !ok || len(strings.TrimSpace(value)) == 0 {
  185. return fallback, nil
  186. }
  187. admin, err := Account.EnsureAdminByName(strings.TrimSpace(value), "")
  188. if err != nil {
  189. if strict {
  190. return "", err
  191. }
  192. logs.Error(fieldName+" 负责人处理失败:", err)
  193. return fallback, nil
  194. }
  195. return admin.T_uuid, nil
  196. }
  197. taskName := strings.TrimSpace(row["任务名称"])
  198. if len(taskName) == 0 {
  199. return "", fmt.Errorf("任务名称缺失")
  200. }
  201. snValue := strings.TrimSpace(row["SN"])
  202. classPath := ""
  203. if vt.T_class > 0 {
  204. if cls, err := VerifyTemplate.Read_VerifyTemplateClass_ById(vt.T_class); err == nil {
  205. p := cls.T_path
  206. p = strings.Trim(p, "/")
  207. p = strings.TrimPrefix(p, "0/")
  208. classPath = p
  209. }
  210. }
  211. schemeFallback := ""
  212. collectionFallback := ""
  213. reportingFallback := ""
  214. deliveryFallback := ""
  215. projectFallback := ""
  216. categoryFallback := ""
  217. deviceTypeFallback := ""
  218. verifyTypeFallback := ""
  219. if taskExists {
  220. schemeFallback = existingTask.T_scheme
  221. collectionFallback = existingTask.T_collection
  222. reportingFallback = existingTask.T_reporting
  223. deliveryFallback = existingTask.T_delivery
  224. projectFallback = existingTask.T_project
  225. categoryFallback = existingTask.T_category
  226. deviceTypeFallback = existingTask.T_device_type
  227. verifyTypeFallback = existingTask.T_verify_type
  228. }
  229. schemeUUID, err := resolveAdminUUID("实施方案", schemeFallback, false)
  230. if err != nil {
  231. return "", fmt.Errorf("实施方案负责人创建失败: %w", err)
  232. }
  233. collectionUUID, err := resolveAdminUUID("数据采集", collectionFallback, true)
  234. if err != nil {
  235. return "", fmt.Errorf("数据采集负责人创建失败: %w", err)
  236. }
  237. reportingUUID, err := resolveAdminUUID("报告编辑", reportingFallback, true)
  238. if err != nil {
  239. return "", fmt.Errorf("报告编辑负责人创建失败: %w", err)
  240. }
  241. deliveryUUID, err := resolveAdminUUID("交付审核", deliveryFallback, false)
  242. if err != nil {
  243. return "", fmt.Errorf("交付审核负责人创建失败: %w", err)
  244. }
  245. projectUUID, _ := resolveAdminUUID("项目负责人", projectFallback, false)
  246. categoryValue := strings.TrimSpace(row["类别"])
  247. if len(categoryValue) == 0 {
  248. categoryValue = categoryFallback
  249. }
  250. deviceTypeValue := strings.TrimSpace(row["设备类型"])
  251. if len(deviceTypeValue) == 0 {
  252. deviceTypeValue = deviceTypeFallback
  253. } else {
  254. if mapped, ok := Task.DeviceTypeMap[deviceTypeValue]; ok {
  255. deviceTypeValue = mapped
  256. } else {
  257. deviceTypeValue = deviceTypeValue
  258. }
  259. }
  260. verifyTypeValue := strings.TrimSpace(row["验证类型"])
  261. if len(verifyTypeValue) == 0 {
  262. verifyTypeValue = verifyTypeFallback
  263. }
  264. taskRecord := Task.Task{
  265. T_Distributor_id: user.T_Distributor_id,
  266. T_uuid: user.T_uuid,
  267. T_name: taskName,
  268. T_VerifyTemplate_id: templateID,
  269. T_VerifyTemplate_class: classPath,
  270. T_sn: snValue,
  271. T_uid: taskUID,
  272. T_scheme: schemeUUID,
  273. T_collection: collectionUUID,
  274. T_reporting: reportingUUID,
  275. T_delivery: deliveryUUID,
  276. T_project: projectUUID,
  277. T_category: categoryValue,
  278. T_device_type: deviceTypeValue,
  279. T_verify_type: verifyTypeValue,
  280. }
  281. var taskID string
  282. if taskExists {
  283. taskRecord.Id = existingTask.Id
  284. taskRecord.T_task_id = existingTask.T_task_id
  285. taskRecord.T_State = existingTask.T_State
  286. if ok := Task.Update_Task(taskRecord, "T_Distributor_id", "T_uuid", "T_name", "T_VerifyTemplate_id", "T_VerifyTemplate_class", "T_sn", "T_uid", "T_scheme", "T_collection", "T_reporting", "T_delivery", "T_project", "T_category", "T_device_type", "T_verify_type"); !ok {
  287. return "", fmt.Errorf("更新任务失败")
  288. }
  289. taskID = existingTask.T_task_id
  290. } else {
  291. dc := Device.DeviceClass{
  292. T_uuid: user.T_uuid,
  293. T_State: 1,
  294. }
  295. classID, ok := Device.Add_DeviceClass(dc)
  296. if !ok {
  297. return "", fmt.Errorf("创建分类失败")
  298. }
  299. taskRecord.T_class = int(classID)
  300. taskRecord.T_State = 1
  301. taskRecord.T_deadline = time.Now().AddDate(0, 2, 0).Format("2006-01-02")
  302. if len(strings.TrimSpace(taskRecord.T_device_type)) > 0 {
  303. number, err := Task.GenerateNextT_report_number(taskRecord.T_device_type)
  304. if err != nil {
  305. return "", fmt.Errorf("生成报告编号失败: %w", err)
  306. }
  307. taskRecord.T_report_number = number
  308. }
  309. if newID, ok := Task.Add_Task(taskRecord); !ok {
  310. return "", fmt.Errorf("创建任务失败")
  311. } else {
  312. taskID = newID
  313. }
  314. }
  315. mapList, _ := VerifyTemplate.Read_VerifyTemplateMap_List(templateID, 0, 0)
  316. labelMap := make(map[string]VerifyTemplate.VerifyTemplateMap_R, len(mapList))
  317. for _, m := range mapList {
  318. labelMap[m.T_name] = m
  319. }
  320. dataList := make([]VerifyTemplate.VerifyTemplateMapData, 0, len(row))
  321. for key, val := range row {
  322. if vtm, exists := labelMap[key]; exists {
  323. dataList = append(dataList, VerifyTemplate.VerifyTemplateMapData{
  324. T_source: vtm.T_source,
  325. T_task_id: taskID,
  326. T_VerifyTemplate_id: templateID,
  327. T_VerifyTemplateMap_id: vtm.T_id,
  328. T_value: val,
  329. T_Required: vtm.T_Required,
  330. T_Construction: vtm.T_Construction,
  331. T_flow_sort: vtm.T_flow_sort,
  332. T_max_time: vtm.T_max_time,
  333. T_min_time: vtm.T_min_time,
  334. T_start_time: int64(vtm.T_start_time),
  335. })
  336. }
  337. }
  338. if len(dataList) > 0 {
  339. if _, ok := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(dataList); !ok {
  340. return "", fmt.Errorf("写入模版数据失败")
  341. }
  342. }
  343. return taskID, nil
  344. }
  345. // 列表 -
  346. func (c *TaskController) List() {
  347. // 验证登录 User_is, User_r
  348. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  349. if !User_is {
  350. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  351. c.ServeJSON()
  352. return
  353. }
  354. var r_jsons lib.R_JSONS
  355. page, _ := c.GetInt("page")
  356. if page < 1 {
  357. page = 1
  358. }
  359. page_z, _ := c.GetInt("page_z")
  360. if page_z < 1 {
  361. page_z = conf.Page_size
  362. }
  363. T_name := c.GetString("T_name")
  364. T_company := c.GetString("T_company") // 公司名称
  365. T_uuid := c.GetString("T_uuid")
  366. T_InfoCollection_id := c.GetString("T_InfoCollection_id")
  367. T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
  368. T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
  369. T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
  370. T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
  371. T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  372. T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  373. T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  374. T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
  375. T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
  376. CreateTime := c.GetString("CreateTime") // 任务添加时间
  377. UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  378. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  379. var T_company_list []string
  380. if len(T_company) > 0 {
  381. T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
  382. }
  383. var T_admin string
  384. if User_r.T_power > 2 {
  385. T_admin = User_r.T_uuid
  386. }
  387. // 经销商下管理员可查看自己经销商下所有的任务
  388. // 经销商下其他角色只能查看分配给自己的任务
  389. if len(User_r.T_Distributor_id) > 0 && User_r.T_power <= 2 {
  390. T_admin = ""
  391. }
  392. var cnt int
  393. List, cnt := Task.Read_Task_List(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_scheme, T_collection, T_reporting, T_delivery,
  394. T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
  395. T_company_list, UserMap, AdminMap, CreateTime, page, page_z)
  396. page_size := math.Ceil(float64(cnt) / float64(page_z))
  397. r_jsons.List = List
  398. r_jsons.Page = page
  399. r_jsons.Page_size = int(page_size)
  400. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  401. r_jsons.Num = cnt
  402. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  403. c.ServeJSON()
  404. return
  405. }
  406. // 报告统计
  407. func (c *TaskController) Stat() {
  408. // 验证登录 User_is, User_r
  409. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  410. if !User_is {
  411. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  412. c.ServeJSON()
  413. return
  414. }
  415. var r_jsons lib.R_JSONS
  416. page, _ := c.GetInt("page")
  417. if page < 1 {
  418. page = 1
  419. }
  420. page_z, _ := c.GetInt("page_z")
  421. if page_z < 1 {
  422. page_z = conf.Page_size
  423. }
  424. T_name := c.GetString("T_name")
  425. T_company := c.GetString("T_company") // 公司名称
  426. T_uuid := c.GetString("T_uuid")
  427. T_InfoCollection_id := c.GetString("T_InfoCollection_id")
  428. T_project := c.GetString("T_project") // 项目 负责人UUID
  429. T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
  430. T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
  431. T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
  432. T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
  433. T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  434. T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  435. T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  436. T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
  437. T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
  438. CreateTime := c.GetString("CreateTime") // 任务添加时间
  439. UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  440. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  441. var T_company_list []string
  442. if len(T_company) > 0 {
  443. T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
  444. }
  445. var T_admin string
  446. if User_r.T_power > 2 {
  447. T_admin = User_r.T_uuid
  448. }
  449. var cnt int
  450. List, cnt := Task.Read_Task_Stat(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_project, T_scheme, T_collection, T_reporting, T_delivery,
  451. T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
  452. T_company_list, UserMap, AdminMap, CreateTime, page, page_z)
  453. page_size := math.Ceil(float64(cnt) / float64(page_z))
  454. r_jsons.List = List
  455. r_jsons.Page = page
  456. r_jsons.Page_size = int(page_size)
  457. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  458. r_jsons.Num = cnt
  459. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  460. c.ServeJSON()
  461. return
  462. }
  463. // 报告统计 - 导出excel
  464. func (c *TaskController) Stat_Excel() {
  465. // 验证登录 User_is, User_r
  466. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  467. if !User_is {
  468. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  469. c.ServeJSON()
  470. return
  471. }
  472. T_name := c.GetString("T_name")
  473. T_company := c.GetString("T_company") // 公司名称
  474. T_uuid := c.GetString("T_uuid")
  475. T_InfoCollection_id := c.GetString("T_InfoCollection_id")
  476. T_project := c.GetString("T_project") // 项目 负责人UUID
  477. T_scheme := c.GetString("T_scheme") // 实施方案 负责人UUID
  478. T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
  479. T_reporting := c.GetString("T_reporting") // 报告编写 负责人UUID
  480. T_delivery := c.GetString("T_delivery") // 交付审核 负责人UUID
  481. T_scheme_state := c.GetString("T_scheme_state") // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  482. T_collection_state := c.GetString("T_collection_state") // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  483. T_reporting_state := c.GetString("T_reporting_state") // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  484. T_delivery_state := c.GetString("T_delivery_state") // 交付审核 状态 0 未完成 1 已完成 2 处理中
  485. T_marking_state := c.GetString("T_marking_state") // 验证标识 状态 0 未完成 1 已完成
  486. CreateTime := c.GetString("CreateTime") // 任务添加时间
  487. UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  488. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  489. var T_company_list []string
  490. if len(T_company) > 0 {
  491. T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
  492. }
  493. var T_admin string
  494. if User_r.T_power > 2 {
  495. T_admin = User_r.T_uuid
  496. }
  497. List, _ := Task.Read_Task_Stat(User_r.T_Distributor_id, T_uuid, T_admin, T_name, T_InfoCollection_id, T_project, T_scheme, T_collection, T_reporting, T_delivery,
  498. T_scheme_state, T_collection_state, T_reporting_state, T_delivery_state, T_marking_state,
  499. T_company_list, UserMap, AdminMap, CreateTime, 0, 9999)
  500. f := excelize.NewFile() // 设置单元格的值
  501. line := 1
  502. // 这里设置表头
  503. f.MergeCell("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("A%d", line+1))
  504. f.MergeCell("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("B%d", line+1))
  505. f.MergeCell("Sheet1", fmt.Sprintf("C%d", line), fmt.Sprintf("C%d", line+1))
  506. f.MergeCell("Sheet1", fmt.Sprintf("D%d", line), fmt.Sprintf("D%d", line+1))
  507. f.MergeCell("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("E%d", line+1))
  508. f.MergeCell("Sheet1", fmt.Sprintf("F%d", line), fmt.Sprintf("F%d", line+1))
  509. f.MergeCell("Sheet1", fmt.Sprintf("G%d", line), fmt.Sprintf("G%d", line+1))
  510. f.MergeCell("Sheet1", fmt.Sprintf("H%d", line), fmt.Sprintf("H%d", line+1))
  511. f.MergeCell("Sheet1", fmt.Sprintf("I%d", line), fmt.Sprintf("I%d", line+1))
  512. f.MergeCell("Sheet1", fmt.Sprintf("J%d", line), fmt.Sprintf("J%d", line+1))
  513. f.MergeCell("Sheet1", fmt.Sprintf("K%d", line), fmt.Sprintf("K%d", line+1))
  514. f.MergeCell("Sheet1", fmt.Sprintf("L%d", line), fmt.Sprintf("L%d", line+1))
  515. f.MergeCell("Sheet1", fmt.Sprintf("M%d", line), fmt.Sprintf("M%d", line+1))
  516. f.MergeCell("Sheet1", fmt.Sprintf("N%d", line), fmt.Sprintf("N%d", line+1))
  517. f.MergeCell("Sheet1", fmt.Sprintf("O%d", line), fmt.Sprintf("O%d", line+1))
  518. f.MergeCell("Sheet1", fmt.Sprintf("P%d", line), fmt.Sprintf("P%d", line+1))
  519. f.MergeCell("Sheet1", fmt.Sprintf("Q%d", line), fmt.Sprintf("U%d", line))
  520. f.MergeCell("Sheet1", fmt.Sprintf("V%d", line), fmt.Sprintf("AA%d", line))
  521. f.MergeCell("Sheet1", fmt.Sprintf("AB%d", line), fmt.Sprintf("AG%d", line))
  522. f.MergeCell("Sheet1", fmt.Sprintf("AH%d", line), fmt.Sprintf("AM%d", line))
  523. f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line), "信息表")
  524. f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line), "方案")
  525. f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line), "实施")
  526. f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line), "报告")
  527. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), "序号")
  528. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), "公司名称")
  529. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), "报告名称")
  530. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), "项目负责人")
  531. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), "地区")
  532. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), "类别")
  533. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), "设备类型")
  534. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), "规格/容积")
  535. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), "验证类型")
  536. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), "标的物名称")
  537. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), "验证温度范围")
  538. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), "报告编号")
  539. f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), "项目开始时间")
  540. f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), "项目用时")
  541. f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), "驳回次数")
  542. f.SetCellValue("Sheet1", fmt.Sprintf("P%d", line), "回款")
  543. f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line+1), "编写人")
  544. f.SetCellValue("Sheet1", fmt.Sprintf("R%d", line+1), "状态")
  545. f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line+1), "开始时间")
  546. f.SetCellValue("Sheet1", fmt.Sprintf("T%d", line+1), "退回次数")
  547. f.SetCellValue("Sheet1", fmt.Sprintf("U%d", line+1), "所需时间")
  548. f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line+1), "编写人")
  549. f.SetCellValue("Sheet1", fmt.Sprintf("W%d", line+1), "状态")
  550. f.SetCellValue("Sheet1", fmt.Sprintf("X%d", line+1), "开始时间")
  551. f.SetCellValue("Sheet1", fmt.Sprintf("Y%d", line+1), "退回次数")
  552. f.SetCellValue("Sheet1", fmt.Sprintf("Z%d", line+1), "所需时间")
  553. f.SetCellValue("Sheet1", fmt.Sprintf("AA%d", line+1), "超时时间")
  554. f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line+1), "编写人")
  555. f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line+1), "状态")
  556. f.SetCellValue("Sheet1", fmt.Sprintf("AD%d", line+1), "开始时间")
  557. f.SetCellValue("Sheet1", fmt.Sprintf("AE%d", line+1), "退回次数")
  558. f.SetCellValue("Sheet1", fmt.Sprintf("AF%d", line+1), "所需时间")
  559. f.SetCellValue("Sheet1", fmt.Sprintf("AG%d", line+1), "超时时间")
  560. f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line+1), "编写人")
  561. f.SetCellValue("Sheet1", fmt.Sprintf("AI%d", line+1), "状态")
  562. f.SetCellValue("Sheet1", fmt.Sprintf("AJ%d", line+1), "开始时间")
  563. f.SetCellValue("Sheet1", fmt.Sprintf("AK%d", line+1), "退回次数")
  564. f.SetCellValue("Sheet1", fmt.Sprintf("AL%d", line+1), "所需时间")
  565. f.SetCellValue("Sheet1", fmt.Sprintf("AM%d", line+1), "超时时间")
  566. f.SetCellValue("Sheet1", fmt.Sprintf("AN%d", line+1), "领导备注")
  567. // 设置列宽
  568. f.SetColWidth("Sheet1", "A", "A", 7)
  569. f.SetColWidth("Sheet1", "B", "B", 20)
  570. f.SetColWidth("Sheet1", "C", "C", 10)
  571. f.SetColWidth("Sheet1", "D", "D", 10)
  572. f.SetColWidth("Sheet1", "E", "E", 12)
  573. f.SetColWidth("Sheet1", "F", "F", 8)
  574. f.SetColWidth("Sheet1", "G", "G", 12)
  575. f.SetColWidth("Sheet1", "H", "H", 14)
  576. f.SetColWidth("Sheet1", "I", "I", 12)
  577. f.SetColWidth("Sheet1", "J", "J", 12)
  578. f.SetColWidth("Sheet1", "K", "K", 12)
  579. f.SetColWidth("Sheet1", "L", "L", 12)
  580. f.SetColWidth("Sheet1", "M", "M", 12)
  581. f.SetColWidth("Sheet1", "N", "N", 12)
  582. f.SetColWidth("Sheet1", "O", "O", 10)
  583. f.SetColWidth("Sheet1", "P", "P", 8)
  584. f.SetColWidth("Sheet1", "Q", "Q", 8)
  585. f.SetColWidth("Sheet1", "R", "R", 8)
  586. f.SetColWidth("Sheet1", "S", "S", 12)
  587. f.SetColWidth("Sheet1", "T", "T", 10)
  588. f.SetColWidth("Sheet1", "U", "U", 10)
  589. f.SetColWidth("Sheet1", "V", "V", 8)
  590. f.SetColWidth("Sheet1", "W", "W", 8)
  591. f.SetColWidth("Sheet1", "X", "X", 12)
  592. f.SetColWidth("Sheet1", "Y", "Y", 10)
  593. f.SetColWidth("Sheet1", "Z", "Z", 12)
  594. f.SetColWidth("Sheet1", "AA", "AA", 12)
  595. f.SetColWidth("Sheet1", "AB", "AB", 8)
  596. f.SetColWidth("Sheet1", "AC", "AC", 8)
  597. f.SetColWidth("Sheet1", "AD", "AD", 12)
  598. f.SetColWidth("Sheet1", "AE", "AE", 10)
  599. f.SetColWidth("Sheet1", "AF", "AF", 12)
  600. f.SetColWidth("Sheet1", "AG", "AG", 12)
  601. f.SetColWidth("Sheet1", "AG", "AG", 10)
  602. f.SetColWidth("Sheet1", "AH", "AH", 8)
  603. f.SetColWidth("Sheet1", "AI", "AI", 8)
  604. f.SetColWidth("Sheet1", "AJ", "AJ", 10)
  605. f.SetColWidth("Sheet1", "AK", "AK", 12)
  606. f.SetColWidth("Sheet1", "AL", "AL", 12)
  607. f.SetColWidth("Sheet1", "AM", "AM", 12)
  608. Style1, _ := f.NewStyle(
  609. &excelize.Style{
  610. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  611. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  612. Border: []excelize.Border{
  613. {Type: "left", Color: "000000", Style: 1},
  614. {Type: "top", Color: "000000", Style: 1},
  615. {Type: "bottom", Color: "000000", Style: 1},
  616. {Type: "right", Color: "000000", Style: 1},
  617. },
  618. })
  619. f.SetCellStyle("Sheet1", "A1", "AM2", Style1)
  620. f.SetRowHeight("Sheet1", 1, 25)
  621. f.SetRowHeight("Sheet1", 2, 25)
  622. line += 1
  623. // 循环写入数据
  624. for i, v := range List {
  625. line++
  626. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
  627. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v.T_user_name)
  628. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_name)
  629. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_project_name)
  630. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("%s-%s-%s", v.T_province, v.T_city, v.T_district))
  631. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_category)
  632. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_device_type)
  633. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_volume)
  634. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.T_verify_type)
  635. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.T_subject_matter)
  636. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v.T_temp_range)
  637. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), fmt.Sprintf("%s-%s", v.T_report_type, v.T_report_number))
  638. f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), v.T_start_time)
  639. f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), v.T_time_interval)
  640. f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), v.T_reject_times)
  641. returnedMoney := "否"
  642. if v.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney {
  643. returnedMoney = "是"
  644. }
  645. f.SetCellValue("Sheet1", fmt.Sprintf("P%d", line), returnedMoney)
  646. f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", line), v.InfoCollection.T_submit_uuid_name)
  647. f.SetCellValue("Sheet1", fmt.Sprintf("R%d", line), InfoCollection.InfoCollectionStatusMap[v.InfoCollection.T_State])
  648. f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), v.InfoCollection.T_start_time)
  649. f.SetCellValue("Sheet1", fmt.Sprintf("T%d", line), v.InfoCollection.T_return_times)
  650. f.SetCellValue("Sheet1", fmt.Sprintf("U%d", line), v.InfoCollection.T_time_interval)
  651. f.SetCellValue("Sheet1", fmt.Sprintf("V%d", line), v.T_scheme_name)
  652. f.SetCellValue("Sheet1", fmt.Sprintf("W%d", line), Task.TaskSchemeStateMap[v.T_scheme_state])
  653. f.SetCellValue("Sheet1", fmt.Sprintf("X%d", line), v.T_scheme_start_time)
  654. f.SetCellValue("Sheet1", fmt.Sprintf("Y%d", line), v.T_scheme_return_times)
  655. f.SetCellValue("Sheet1", fmt.Sprintf("Z%d", line), v.T_scheme_time_interval)
  656. f.SetCellValue("Sheet1", fmt.Sprintf("AA%d", line), v.T_scheme_overtime)
  657. f.SetCellValue("Sheet1", fmt.Sprintf("AB%d", line), v.T_collection_name)
  658. f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line), Task.TaskCollectionStateMap[v.T_collection_state])
  659. f.SetCellValue("Sheet1", fmt.Sprintf("AD%d", line), v.T_collection_start_time)
  660. f.SetCellValue("Sheet1", fmt.Sprintf("AE%d", line), v.T_collection_return_times)
  661. f.SetCellValue("Sheet1", fmt.Sprintf("AF%d", line), v.T_collection_time_interval)
  662. f.SetCellValue("Sheet1", fmt.Sprintf("AG%d", line), v.T_collection_overtime)
  663. f.SetCellValue("Sheet1", fmt.Sprintf("AH%d", line), v.T_reporting_name)
  664. f.SetCellValue("Sheet1", fmt.Sprintf("AI%d", line), Task.TaskReportingStateMap[v.T_reporting_state])
  665. f.SetCellValue("Sheet1", fmt.Sprintf("AJ%d", line), v.T_reporting_start_time)
  666. f.SetCellValue("Sheet1", fmt.Sprintf("AK%d", line), v.T_reporting_return_times)
  667. f.SetCellValue("Sheet1", fmt.Sprintf("AL%d", line), v.T_reporting_time_interval)
  668. f.SetCellValue("Sheet1", fmt.Sprintf("AM%d", line), v.T_reporting_overtime)
  669. f.SetCellValue("Sheet1", fmt.Sprintf("AN%d", line), v.T_record)
  670. }
  671. Style2, _ := f.NewStyle(
  672. &excelize.Style{
  673. Font: &excelize.Font{Size: 10, Family: "宋体"},
  674. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  675. Border: []excelize.Border{
  676. {Type: "left", Color: "000000", Style: 1},
  677. {Type: "top", Color: "000000", Style: 1},
  678. {Type: "bottom", Color: "000000", Style: 1},
  679. {Type: "right", Color: "000000", Style: 1},
  680. },
  681. })
  682. f.SetCellStyle("Sheet1", "A2", fmt.Sprintf("AM%d", line), Style2)
  683. StyleBlueFill, _ := f.NewStyle(
  684. &excelize.Style{
  685. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  686. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  687. Border: []excelize.Border{
  688. {Type: "left", Color: "000000", Style: 1},
  689. {Type: "top", Color: "000000", Style: 1},
  690. {Type: "bottom", Color: "000000", Style: 1},
  691. {Type: "right", Color: "000000", Style: 1},
  692. },
  693. Fill: excelize.Fill{Type: "pattern", Color: []string{"#DEE5F5"}, Pattern: 1},
  694. })
  695. // 粉色填充
  696. StylePinkFill, _ := f.NewStyle(
  697. &excelize.Style{
  698. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  699. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  700. Border: []excelize.Border{
  701. {Type: "left", Color: "000000", Style: 1},
  702. {Type: "top", Color: "000000", Style: 1},
  703. {Type: "bottom", Color: "000000", Style: 1},
  704. {Type: "right", Color: "000000", Style: 1},
  705. },
  706. Fill: excelize.Fill{Type: "pattern", Color: []string{"#FBDFE2"}, Pattern: 1},
  707. })
  708. StyleOrangeFill, _ := f.NewStyle(
  709. &excelize.Style{
  710. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  711. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  712. Border: []excelize.Border{
  713. {Type: "left", Color: "000000", Style: 1},
  714. {Type: "top", Color: "000000", Style: 1},
  715. {Type: "bottom", Color: "000000", Style: 1},
  716. {Type: "right", Color: "000000", Style: 1},
  717. },
  718. Fill: excelize.Fill{Type: "pattern", Color: []string{"#FCE7D8"}, Pattern: 1},
  719. })
  720. StyleYellowFill, _ := f.NewStyle(
  721. &excelize.Style{
  722. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  723. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  724. Border: []excelize.Border{
  725. {Type: "left", Color: "000000", Style: 1},
  726. {Type: "top", Color: "000000", Style: 1},
  727. {Type: "bottom", Color: "000000", Style: 1},
  728. {Type: "right", Color: "000000", Style: 1},
  729. },
  730. Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFF5D0"}, Pattern: 1},
  731. })
  732. StyleGreenFill, _ := f.NewStyle(
  733. &excelize.Style{
  734. Font: &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
  735. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  736. Border: []excelize.Border{
  737. {Type: "left", Color: "000000", Style: 1},
  738. {Type: "top", Color: "000000", Style: 1},
  739. {Type: "bottom", Color: "000000", Style: 1},
  740. {Type: "right", Color: "000000", Style: 1},
  741. },
  742. Fill: excelize.Fill{Type: "pattern", Color: []string{"#E7F4DE"}, Pattern: 1},
  743. })
  744. f.SetCellStyle("Sheet1", "A1", "AM2", StyleBlueFill)
  745. f.SetCellStyle("Sheet1", "Q1", "U1", StylePinkFill)
  746. f.SetCellStyle("Sheet1", "V1", "AA1", StyleOrangeFill)
  747. f.SetCellStyle("Sheet1", "AB1", "AG1", StyleYellowFill)
  748. f.SetCellStyle("Sheet1", "AH1", "AM1", StyleGreenFill)
  749. f.SetCellStyle("Sheet1", "AN1", "AN2", StyleBlueFill)
  750. // 冻结1-2行
  751. f.SetPanes("Sheet1", &excelize.Panes{
  752. Freeze: true,
  753. Split: false,
  754. XSplit: 3,
  755. YSplit: 2,
  756. TopLeftCell: "A1",
  757. ActivePane: "topRight",
  758. })
  759. lib.Create_Dir("./ofile")
  760. timeStr := time.Now().Format("20060102150405")
  761. // 保存文件
  762. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  763. logs.Error(lib.FuncName(), err)
  764. }
  765. if !lib.Pload_qiniu("ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx") {
  766. c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
  767. c.ServeJSON()
  768. return
  769. }
  770. //删除目录
  771. err := os.Remove("ofile/" + timeStr + ".xlsx")
  772. if err != nil {
  773. logs.Error(lib.FuncName(), err)
  774. }
  775. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"}
  776. c.ServeJSON()
  777. return
  778. }
  779. // 获取任务负责人列表
  780. func (c *TaskController) GetTaskUserList() {
  781. // 验证登录 User_is, User_r
  782. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  783. if !User_is {
  784. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  785. c.ServeJSON()
  786. return
  787. }
  788. T_type := c.GetString("T_type") // T_project项目 T_scheme方案 T_collection数据采集 T_reporting报告
  789. list := Task.Get_Task_UserList(T_type)
  790. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  791. var User_list []Account.Admin_R
  792. for _, v := range list {
  793. if len(v) == 0 {
  794. continue
  795. }
  796. User_list = append(User_list, Account.Admin_R{T_uuid: v, T_name: AdminMap[v]})
  797. }
  798. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: User_list}
  799. c.ServeJSON()
  800. return
  801. }
  802. // 列表 -
  803. func (c *TaskController) UserTaskList() {
  804. // 验证登录 User_is, User_r
  805. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  806. if !User_is {
  807. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  808. c.ServeJSON()
  809. return
  810. }
  811. var r_jsons lib.R_JSONS
  812. page, _ := c.GetInt("page")
  813. if page < 1 {
  814. page = 1
  815. }
  816. page_z, _ := c.GetInt("page_z")
  817. if page_z < 1 {
  818. page_z = conf.Page_size
  819. }
  820. T_name := c.GetString("T_name")
  821. UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  822. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  823. var cnt int
  824. List, cnt := Task.Read_UserTask_List(User_r.T_uuid, T_name, UserMap, AdminMap, page, page_z)
  825. page_size := math.Ceil(float64(cnt) / float64(page_z))
  826. r_jsons.List = List
  827. r_jsons.Page = page
  828. r_jsons.Page_size = int(page_size)
  829. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  830. r_jsons.Num = cnt
  831. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  832. c.ServeJSON()
  833. return
  834. }
  835. // 获取-
  836. func (c *TaskController) Get() {
  837. // 验证登录 User_is, User_r
  838. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  839. if !User_is {
  840. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  841. c.ServeJSON()
  842. return
  843. }
  844. T_task_id := c.GetString("T_task_id")
  845. r, is := Task.Read_Task(T_task_id)
  846. if !is {
  847. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  848. c.ServeJSON()
  849. return
  850. }
  851. // 添加浏览量
  852. _ = Task.Add_Task_Visit(r)
  853. r.T_Visit += 1
  854. userMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  855. adminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  856. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Task.TaskToTask_Stat(r, userMap, adminMap)}
  857. c.ServeJSON()
  858. return
  859. }
  860. // 添加-
  861. func (c *TaskController) Add() {
  862. // 验证登录 User_is, User_r
  863. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  864. if !User_is {
  865. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  866. c.ServeJSON()
  867. return
  868. }
  869. dc := Device.DeviceClass{
  870. T_uuid: User_r.T_uuid,
  871. T_State: 1,
  872. }
  873. T_class_id, is := Device.Add_DeviceClass(dc)
  874. if !is {
  875. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
  876. c.ServeJSON()
  877. return
  878. }
  879. System.Add_UserLogs_T(User_r.T_uuid, "分类管理", "添加", dc)
  880. T_InfoCollection_id := c.GetString("T_InfoCollection_id") // 信息采集id
  881. T_name := c.GetString("T_name")
  882. T_uuid := c.GetString("T_uuid") // 用户uuid
  883. T_VerifyTemplate_class := c.GetString("T_VerifyTemplate_class")
  884. T_VerifyTemplate_id := c.GetString("T_VerifyTemplate_id")
  885. T_deadline := c.GetString("T_deadline")
  886. T_scheme := c.GetString("T_scheme")
  887. T_collection := c.GetString("T_collection")
  888. T_reporting := c.GetString("T_reporting")
  889. T_delivery := c.GetString("T_delivery")
  890. T_project := c.GetString("T_project") // 项目 负责人UUID
  891. T_province := c.GetString("T_province") // 省
  892. T_city := c.GetString("T_city") // 市
  893. T_district := c.GetString("T_district") // 区
  894. T_province_code := c.GetString("T_province_code") // 省 code
  895. T_city_code := c.GetString("T_city_code") // 市 code
  896. T_district_code := c.GetString("T_district_code") // 区 code
  897. T_category := c.GetString("T_category") // 类别
  898. T_device_type := c.GetString("T_device_type") // 设备类型
  899. T_volume := c.GetString("T_volume") // 规格/容积
  900. T_verify_type := c.GetString("T_verify_type") // 验证类型
  901. T_subject_matter := c.GetString("T_subject_matter") // 标的物名称
  902. T_temp_range := c.GetString("T_temp_range") // 验证温度范围
  903. T_report_number := c.GetString("T_report_number") // 报告编号
  904. T_report_type := c.GetString("T_report_type") // 报告类型
  905. T_device_quantity, _ := c.GetInt("T_device_quantity") // 终端数量
  906. T_cnas, _ := c.GetInt("T_cnas") // cnas实验室
  907. // 查询信息采集信息
  908. infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
  909. if !is {
  910. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
  911. c.ServeJSON()
  912. return
  913. }
  914. // 查询信息采集信息
  915. user, is := Account.Read_User(T_uuid)
  916. if !is {
  917. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid 错误!"}
  918. c.ServeJSON()
  919. return
  920. }
  921. var_ := Task.Task{
  922. T_Distributor_id: user.T_Distributor_id,
  923. T_InfoCollection_id: T_InfoCollection_id,
  924. T_InfoTemplate_id: infoCollection.T_InfoTemplate_id,
  925. T_start_time: infoCollection.T_start_time, // 项目开始时间使用信息采集开始时间
  926. T_class: int(T_class_id),
  927. T_uuid: T_uuid,
  928. T_name: T_name,
  929. T_VerifyTemplate_class: T_VerifyTemplate_class,
  930. T_VerifyTemplate_id: T_VerifyTemplate_id,
  931. T_deadline: T_deadline,
  932. T_scheme: T_scheme,
  933. T_collection: T_collection,
  934. T_reporting: T_reporting,
  935. T_delivery: T_delivery,
  936. T_Show: 1,
  937. T_State: 1,
  938. T_project: T_project,
  939. T_province: T_province,
  940. T_city: T_city,
  941. T_district: T_district,
  942. T_province_code: T_province_code,
  943. T_city_code: T_city_code,
  944. T_district_code: T_district_code,
  945. T_category: T_category,
  946. T_device_type: T_device_type,
  947. T_volume: T_volume,
  948. T_verify_type: T_verify_type,
  949. T_subject_matter: T_subject_matter,
  950. T_temp_range: T_temp_range,
  951. T_report_number: T_report_number,
  952. T_report_type: T_report_type,
  953. T_device_quantity: T_device_quantity,
  954. T_cnas: T_cnas,
  955. }
  956. if T_report_number != "/" {
  957. _, exist := Task.Read_TaskbyT_report_number(T_report_number)
  958. if exist {
  959. c.Data["json"] = lib.JSONS{Code: 202, Msg: "报告编号已存在!"}
  960. c.ServeJSON()
  961. return
  962. }
  963. }
  964. T_task_id, is := Task.Add_Task(var_)
  965. if !is {
  966. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  967. c.ServeJSON()
  968. return
  969. }
  970. NatsServer.Create_Local_Table(T_task_id)
  971. Task.Redis_Task_T_report_number_DelK(T_report_number) // 删除redis内的任务编号
  972. // 通知
  973. _, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
  974. go wx.WxSend(var_.T_scheme, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  975. go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  976. go wx.WxSend(var_.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  977. go wx.WxSend(var_.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  978. // 同步信息采集表 --------
  979. InfoCollection_Map_List := InfoCollection.Read_InfoTemplateMap_List_For_Data(var_.T_InfoTemplate_id)
  980. InfoCollection_Data := InfoCollection.Read_InfoTemplateMapData_List(var_.T_InfoCollection_id, var_.T_InfoTemplate_id, InfoCollection_Map_List)
  981. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(var_.T_VerifyTemplate_id, 0, 0)
  982. Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_task_id, var_.T_VerifyTemplate_id, Map_List)
  983. InfoCollectionDataMap := make(map[string]string)
  984. for _, data := range InfoCollection_Data {
  985. InfoCollectionDataMap[data.T_name] = data.T_value
  986. }
  987. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  988. for _, v := range Data {
  989. if len(v.T_value) > 0 {
  990. continue
  991. }
  992. if InfoCollectionDataMap[v.T_name] == "" {
  993. continue
  994. }
  995. val := VerifyTemplate.VerifyTemplateMapData{
  996. T_source: v.T_source,
  997. T_task_id: T_task_id,
  998. T_VerifyTemplate_id: var_.T_VerifyTemplate_id,
  999. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  1000. T_flow_sort: v.T_flow_sort,
  1001. T_max_time: v.T_max_time,
  1002. T_min_time: v.T_min_time,
  1003. T_value: InfoCollectionDataMap[v.T_name],
  1004. }
  1005. MapDataList = append(MapDataList, val)
  1006. }
  1007. _, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
  1008. if !is {
  1009. c.Data["json"] = lib.JSONS{Code: 202, Msg: "同步信息采集表失败"}
  1010. c.ServeJSON()
  1011. return
  1012. }
  1013. // 同步信息采集表结束 --------
  1014. // 添加任务操作日志
  1015. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "添加", var_)
  1016. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "添加", var_)
  1017. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
  1018. c.ServeJSON()
  1019. return
  1020. }
  1021. // 接收信息采集
  1022. func (c *TaskController) ReceiptInfoCollection() {
  1023. // 验证登录 User_is, User_r
  1024. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1025. if !User_is {
  1026. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1027. c.ServeJSON()
  1028. return
  1029. }
  1030. // 修改信息采集状态为已接收
  1031. T_InfoCollection_id := c.GetString("T_InfoCollection_id")
  1032. //T_status,_ := c.GetInt("T_status")
  1033. infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
  1034. if !is {
  1035. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1036. c.ServeJSON()
  1037. return
  1038. }
  1039. if infoCollection.T_status != InfoCollection.InfoCollectionStatusSubmitted && infoCollection.T_status != InfoCollection.InfoCollectionStatusReceipt {
  1040. c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("当前状态为%s,禁止接收!", InfoCollection.InfoCollectionStatusMap[infoCollection.T_status])}
  1041. c.ServeJSON()
  1042. return
  1043. }
  1044. //infoCollection.T_status = InfoCollection.InfoCollectionStatusReceipt
  1045. //if len(infoCollection.T_end_time) == 0 {
  1046. // infoCollection.T_end_time = time.Now().Format("2006-01-02 15:04:05")
  1047. // infoCollection.T_time_interval, _ = lib.MinutesDifference(infoCollection.T_start_time, infoCollection.T_end_time)
  1048. //}
  1049. //if !InfoCollection.Update_InfoCollection(infoCollection, "T_status", "T_end_time", "T_time_interval") {
  1050. infoCollection.T_status = 3 // 已接收
  1051. if !InfoCollection.Update_InfoCollection(infoCollection, "T_status") {
  1052. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1053. c.ServeJSON()
  1054. return
  1055. }
  1056. System.Add_UserLogs_T(User_r.T_uuid, "信息采集管理", "接收信息采集", infoCollection)
  1057. //if T_status == InfoCollection.InfoCollectionStatusReturn{
  1058. // // 通知 报告负责人审核
  1059. // _, company_r := Account.Read_User_ByT_uuid(infoCollection.T_uuid)
  1060. // System.Add_News(conf.VdelUuid, fmt.Sprintf("【%s-%s】信息采集 已退回", company_r.T_name, infoCollection.T_name), "")
  1061. // go wx.WxSend(conf.VdelUuid, fmt.Sprintf("【%s-%s】信息采集 已退回", company_r.T_name, infoCollection.T_name))
  1062. //
  1063. //}
  1064. // 修改任务管理实施方案开始时间
  1065. //T_task_id := c.GetString("T_task_id")
  1066. //task, is := Task.Read_Task(T_task_id)
  1067. //if !is {
  1068. // c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1069. // c.ServeJSON()
  1070. // return
  1071. //}
  1072. // 添加任务操作日志
  1073. //Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "接收信息采集", task)
  1074. //System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "接收信息采集", task)
  1075. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1076. c.ServeJSON()
  1077. return
  1078. }
  1079. // 添加-
  1080. func (c *TaskController) AddData_Tool() {
  1081. T_uuid := "3e84dda9-9eec-42b9-9350-0894262fc8a1" // 用户uuid
  1082. T_name := c.GetString("T_name")
  1083. T_task_id := c.GetString("T_task_id")
  1084. T_task_id = strings.ToLower(T_task_id)
  1085. r, _ := Task.Read_Task(T_task_id)
  1086. if r.T_collection_state == 2 {
  1087. c.Data["json"] = lib.JSONS{Code: 200, Msg: "数据采集中..."}
  1088. c.ServeJSON()
  1089. return
  1090. }
  1091. if r.Id > 0 {
  1092. // 同步1.0数据
  1093. NatsServer.Sync1_TaskData(T_task_id)
  1094. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
  1095. c.ServeJSON()
  1096. return
  1097. }
  1098. dc := Device.DeviceClass{
  1099. T_uuid: T_uuid,
  1100. T_State: 1,
  1101. }
  1102. T_class_id, is := Device.Add_DeviceClass(dc)
  1103. if !is {
  1104. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
  1105. c.ServeJSON()
  1106. return
  1107. }
  1108. var_ := Task.Task{
  1109. T_task_id: T_task_id,
  1110. T_class: int(T_class_id),
  1111. T_uuid: T_uuid,
  1112. T_name: T_name,
  1113. T_Show: 1,
  1114. T_State: 1,
  1115. T_collection_state: 2,
  1116. }
  1117. _, is = Task.Add_Task_Tool(var_)
  1118. if !is {
  1119. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  1120. c.ServeJSON()
  1121. return
  1122. }
  1123. // 创建本地表
  1124. NatsServer.Create_Local_Table(T_task_id)
  1125. // 同步1.0数据
  1126. NatsServer.Sync1_TaskData(T_task_id)
  1127. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
  1128. c.ServeJSON()
  1129. return
  1130. }
  1131. // 修改采集状态-
  1132. func (c *TaskController) UpCollectionState() {
  1133. // 验证登录 User_is, User_r
  1134. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1135. if !User_is {
  1136. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1137. c.ServeJSON()
  1138. return
  1139. }
  1140. T_collection_state, _ := c.GetInt("T_collection_state")
  1141. T_reason := c.GetString("T_reason") // 退回原因
  1142. T_task_id := c.GetString("T_task_id")
  1143. r, is := Task.Read_Task(T_task_id)
  1144. if !is {
  1145. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1146. c.ServeJSON()
  1147. return
  1148. }
  1149. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1150. r.T_collection_state = T_collection_state
  1151. clos := make([]string, 0)
  1152. clos = append(clos, "T_collection_state")
  1153. if T_collection_state == Task.TaskCollectionStateReturn {
  1154. r.T_collection_return_times += 1
  1155. clos = append(clos, "T_collection_return_times")
  1156. }
  1157. if T_collection_state == Task.TaskCollectionStateSubmitted ||
  1158. T_collection_state == Task.TaskCollectionStateReturn ||
  1159. T_collection_state == Task.TaskCollectionStatePass {
  1160. // 添加已提交状态验证报告记录
  1161. auditRecordJson, err := Task.Add_AuditRecord(r.T_collection_audit_record, "", User_r.T_uuid, T_collection_state, T_reason, "")
  1162. if err != nil {
  1163. return
  1164. }
  1165. r.T_collection_audit_record = auditRecordJson
  1166. clos = append(clos, "T_collection_audit_record")
  1167. }
  1168. if T_collection_state == Task.TaskCollectionStatePass {
  1169. // 数据编辑审核通过时间为验证报告开始时间
  1170. r.T_reporting_start_time = time.Now().Format("2006-01-02 15:04:05")
  1171. clos = append(clos, "T_reporting_start_time")
  1172. }
  1173. if !Task.Update_Task(r, clos...) {
  1174. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1175. c.ServeJSON()
  1176. return
  1177. }
  1178. // 已退回(负责人)
  1179. if T_collection_state == Task.TaskCollectionStateReturn {
  1180. System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】数据编辑 %s,%s", company_r.T_name, r.T_name, Task.TaskCollectionStateMap[T_collection_state], T_reason), "")
  1181. go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】数据编辑 %s,%s", company_r.T_name, r.T_name, Task.TaskCollectionStateMap[T_collection_state], T_reason))
  1182. }
  1183. // 添加任务操作日志
  1184. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改采集状态", r)
  1185. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改采集状态", r)
  1186. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1187. c.ServeJSON()
  1188. return
  1189. }
  1190. func (c *TaskController) UpDeliveryState() {
  1191. // 验证登录 User_is, User_r
  1192. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1193. if !User_is {
  1194. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1195. c.ServeJSON()
  1196. return
  1197. }
  1198. T_delivery_state, _ := c.GetInt("T_delivery_state")
  1199. T_task_id := c.GetString("T_task_id")
  1200. r, is := Task.Read_Task(T_task_id)
  1201. if !is {
  1202. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1203. c.ServeJSON()
  1204. return
  1205. }
  1206. r.T_delivery_state = T_delivery_state
  1207. if !Task.Update_Task(r, "T_delivery_state") {
  1208. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1209. c.ServeJSON()
  1210. return
  1211. }
  1212. // 添加任务操作日志
  1213. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改交付审核状态", r)
  1214. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改交付审核状态", r)
  1215. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1216. c.ServeJSON()
  1217. return
  1218. }
  1219. // 更新线上数据后台执行
  1220. func (c *TaskDataController) TaskData_Up_TaskData_Back() {
  1221. // 验证登录 User_is, User_r
  1222. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1223. if !User_is {
  1224. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1225. c.ServeJSON()
  1226. return
  1227. }
  1228. T_task_id := c.GetString("T_task_id")
  1229. r, is := Task.Read_Task(T_task_id)
  1230. if !is {
  1231. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1232. c.ServeJSON()
  1233. return
  1234. }
  1235. // 通知 报告人员
  1236. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1237. infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  1238. System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】报告已完成,请及时通知客户审核", company_r.T_name, r.T_name), "")
  1239. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】报告已完成,请及时通知客户审核", company_r.T_name, r.T_name))
  1240. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1241. c.ServeJSON()
  1242. return
  1243. }
  1244. // 修改-
  1245. func (c *TaskController) Up() {
  1246. // 验证登录 User_is, User_r
  1247. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1248. if !User_is {
  1249. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1250. c.ServeJSON()
  1251. return
  1252. }
  1253. T_name := c.GetString("T_name")
  1254. T_Show, T_Show_err := c.GetInt("T_Show")
  1255. T_VerifyTemplate_class := c.GetString("T_VerifyTemplate_class")
  1256. T_VerifyTemplate_id := c.GetString("T_VerifyTemplate_id")
  1257. T_deadline := c.GetString("T_deadline")
  1258. T_scheme := c.GetString("T_scheme")
  1259. T_collection := c.GetString("T_collection")
  1260. T_collection_state, _ := c.GetInt("T_collection_state")
  1261. T_collection_signature := c.GetString("T_collection_signature") // 完成编辑签字图片
  1262. T_reporting := c.GetString("T_reporting")
  1263. T_delivery := c.GetString("T_delivery")
  1264. T_record := c.GetString("T_record")
  1265. T_doc1 := c.GetString("T_doc1")
  1266. T_pdf1 := c.GetString("T_pdf1") // 方案
  1267. T_pdf1_stamp, _ := c.GetBool("T_pdf1_stamp") // 方案加盖公章
  1268. T_doc2 := c.GetString("T_doc2")
  1269. T_pdf2 := c.GetString("T_pdf2") // 证书
  1270. T_pdf2_stamp, _ := c.GetBool("T_pdf2_stamp") // 报告加盖公章
  1271. T_doc3 := c.GetString("T_doc3")
  1272. T_pdf3 := c.GetString("T_pdf3")
  1273. T_pdf4 := c.GetString("T_pdf4") // 验证标识
  1274. T_pdf5 := c.GetString("T_pdf5") // 检测报告
  1275. T_pdf6 := c.GetString("T_pdf6") // 原始记录
  1276. T_VerifyDeviceDataStartTime := c.GetString("T_VerifyDeviceDataStartTime") // 验证设备数据开始时间
  1277. T_VerifyDeviceDataEndTime := c.GetString("T_VerifyDeviceDataEndTime") // 验证设备数据开始时间
  1278. T_BindDeviceDataStartTime := c.GetString("T_BindDeviceDataStartTime") // 绑定设备数据开始时间
  1279. T_BindDeviceDataEndTime := c.GetString("T_BindDeviceDataEndTime") // 绑定设备数据结束时间
  1280. T_sn := c.GetString("T_sn") // T_sn
  1281. T_CalibrationExpirationTime := c.GetString("T_CalibrationExpirationTime") // 校准到期时间
  1282. T_project := c.GetString("T_project") // 项目 负责人UUID
  1283. T_province := c.GetString("T_province") // 省
  1284. T_city := c.GetString("T_city") // 市
  1285. T_district := c.GetString("T_district") // 区
  1286. T_province_code := c.GetString("T_province_code") // 省 code
  1287. T_city_code := c.GetString("T_city_code") // 市 code
  1288. T_district_code := c.GetString("T_district_code") // 区 code
  1289. T_category := c.GetString("T_category") // 类别
  1290. T_device_type := c.GetString("T_device_type") // 设备类型
  1291. T_volume := c.GetString("T_volume") // 规格/容积
  1292. T_verify_type := c.GetString("T_verify_type") // 验证类型
  1293. T_subject_matter := c.GetString("T_subject_matter") // 标的物名称
  1294. T_temp_range := c.GetString("T_temp_range") // 验证温度范围
  1295. T_report_number := c.GetString("T_report_number") // 报告编号
  1296. T_report_type := c.GetString("T_report_type") // 报告编号
  1297. T_device_quantity, _ := c.GetInt("T_device_quantity") // 报告编号
  1298. T_cnas, _ := c.GetInt("T_cnas") // cnas实验室
  1299. T_task_id := c.GetString("T_task_id")
  1300. r, is := Task.Read_Task(T_task_id)
  1301. if !is {
  1302. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1303. c.ServeJSON()
  1304. return
  1305. }
  1306. if len(T_report_number) > 0 && T_report_number != "/" {
  1307. t, exist := Task.Read_TaskbyT_report_number(T_report_number)
  1308. if exist && r.T_task_id != t.T_task_id {
  1309. c.Data["json"] = lib.JSONS{Code: 202, Msg: "报告编号已存在!"}
  1310. c.ServeJSON()
  1311. return
  1312. }
  1313. }
  1314. // .......
  1315. clos := make([]string, 0)
  1316. if len(T_name) > 0 {
  1317. r.T_name = T_name
  1318. clos = append(clos, "T_name")
  1319. }
  1320. if T_Show_err == nil {
  1321. r.T_Show = T_Show
  1322. clos = append(clos, "T_Show")
  1323. }
  1324. if len(T_VerifyTemplate_class) > 0 {
  1325. r.T_VerifyTemplate_class = T_VerifyTemplate_class
  1326. clos = append(clos, "T_VerifyTemplate_class")
  1327. }
  1328. if len(T_VerifyTemplate_id) > 0 {
  1329. // 保存旧的 T_VerifyTemplate_id
  1330. old_T_VerifyTemplate_id := r.T_VerifyTemplate_id
  1331. // 判断旧的模版id与新模版id是否一致,如果不一致则复制旧模板数据到新模板
  1332. if old_T_VerifyTemplate_id != T_VerifyTemplate_id && len(old_T_VerifyTemplate_id) > 0 {
  1333. // 创建新任务对象用于复制数据
  1334. new_task := r
  1335. new_task.T_VerifyTemplate_id = T_VerifyTemplate_id
  1336. _, err := CopyMapData(r, new_task, 0)
  1337. if err != nil {
  1338. logs.Error("复制旧模板数据到新模板失败", err)
  1339. }
  1340. }
  1341. r.T_VerifyTemplate_id = T_VerifyTemplate_id
  1342. clos = append(clos, "T_VerifyTemplate_id")
  1343. }
  1344. if len(T_deadline) > 0 {
  1345. r.T_deadline = T_deadline
  1346. clos = append(clos, "T_deadline")
  1347. }
  1348. if len(T_scheme) > 0 {
  1349. r.T_scheme = T_scheme
  1350. clos = append(clos, "T_scheme")
  1351. }
  1352. if len(T_collection) > 0 {
  1353. r.T_collection = T_collection
  1354. clos = append(clos, "T_collection")
  1355. }
  1356. if len(T_reporting) > 0 {
  1357. r.T_reporting = T_reporting
  1358. clos = append(clos, "T_reporting")
  1359. }
  1360. if len(T_delivery) > 0 {
  1361. r.T_delivery = T_delivery
  1362. clos = append(clos, "T_delivery")
  1363. }
  1364. if len(T_record) > 0 {
  1365. r.T_record = T_record
  1366. clos = append(clos, "T_record")
  1367. }
  1368. // 完成编辑后设置实施结束时间
  1369. if T_collection_state == 4 {
  1370. r.T_collection_state = T_collection_state
  1371. clos = append(clos, "T_collection_state")
  1372. r.T_collection_signature = T_collection_signature
  1373. clos = append(clos, "T_collection_signature")
  1374. r.T_collection_end_time = time.Now().Format("2006-01-02 15:04:05")
  1375. clos = append(clos, "T_collection_end_time")
  1376. if len(r.T_collection_start_time) > 0 {
  1377. r.T_collection_time_interval, _ = lib.MinutesDifference(r.T_collection_start_time, r.T_collection_end_time)
  1378. // 扣除暂停时间
  1379. Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 1)
  1380. if Task_Compute > 0 {
  1381. r.T_collection_time_interval -= float64(Task_Compute)
  1382. }
  1383. clos = append(clos, "T_collection_time_interval")
  1384. // 所需时间 > 超时时间
  1385. if r.T_collection_time_interval > Task.TaskCollectionTimeLimit && len(r.T_report_type) > 0 {
  1386. r.T_collection_overtime = r.T_collection_time_interval - Task.TaskCollectionTimeLimit // 超时时间
  1387. clos = append(clos, "T_collection_overtime")
  1388. }
  1389. // 通知 报告人员
  1390. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1391. System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】数据采集 已提交", company_r.T_name, r.T_name), "")
  1392. go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】数据采集 已提交", company_r.T_name, r.T_name))
  1393. }
  1394. // 添加已提交状态数据编辑记录
  1395. auditRecordJson, err := Task.Add_AuditRecord(r.T_collection_audit_record, "", User_r.T_uuid, r.T_collection_state, "", "")
  1396. if err == nil {
  1397. r.T_collection_audit_record = auditRecordJson
  1398. clos = append(clos, "T_collection_audit_record")
  1399. }
  1400. }
  1401. if len(T_doc1) > 0 {
  1402. r.T_doc1 = T_doc1
  1403. clos = append(clos, "T_doc1")
  1404. }
  1405. // 验证报告内容T_pdf1,上传后将 当前任务 验证方案 标志 为 5 (0未完成 1已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交)
  1406. // 上传后设置方案结束时间,计算所需时间和超时时间
  1407. if len(T_pdf1) > 0 {
  1408. r.T_pdf1 = T_pdf1
  1409. clos = append(clos, "T_pdf1")
  1410. //r.T_pdf1_watermark = GetWatermarkPdf(r,T_pdf1,"T_pdf1")
  1411. //clos = append(clos, "T_pdf1_watermark")
  1412. go GetWatermarkPdf(r, T_pdf1, T_pdf1_stamp, "T_pdf1")
  1413. r.T_scheme_state = 5
  1414. clos = append(clos, "T_scheme_state")
  1415. // 添加已提交状态验证方案记录
  1416. auditRecordJson, err := Task.Add_AuditRecord(r.T_scheme_audit_record, "", User_r.T_uuid, r.T_scheme_state, "", "")
  1417. if err != nil {
  1418. return
  1419. }
  1420. r.T_scheme_audit_record = auditRecordJson
  1421. clos = append(clos, "T_scheme_audit_record")
  1422. r.T_scheme_end_time = time.Now().Format("2006-01-02 15:04:05")
  1423. clos = append(clos, "T_scheme_end_time")
  1424. r.T_scheme_time_interval, _ = lib.MinutesDifference(r.T_scheme_start_time, r.T_scheme_end_time)
  1425. Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 0)
  1426. if Task_Compute > 0 {
  1427. r.T_scheme_time_interval -= float64(Task_Compute)
  1428. }
  1429. clos = append(clos, "T_scheme_time_interval")
  1430. // 所需时间 > 超时时间
  1431. if r.T_scheme_time_interval > Task.TaskSchemeTimeLimit[r.T_report_type] && len(r.T_report_type) > 0 {
  1432. r.T_scheme_overtime = r.T_scheme_time_interval - Task.TaskSchemeTimeLimit[r.T_report_type] // 超时时间
  1433. if Task.TaskSchemeTimeLimit[r.T_report_type] == 0 {
  1434. r.T_scheme_overtime = 0
  1435. }
  1436. clos = append(clos, "T_scheme_overtime")
  1437. }
  1438. // 通知 实施人员进场
  1439. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1440. System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 已提交", company_r.T_name, r.T_name), "")
  1441. go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 已提交", company_r.T_name, r.T_name))
  1442. }
  1443. if len(T_doc2) > 0 {
  1444. r.T_doc2 = T_doc2
  1445. clos = append(clos, "T_doc2")
  1446. }
  1447. // 验证报告内容T_pdf2 ,上传后将 当前任务 报告编写 标志 为 1
  1448. // 上传后设置报告结束时间,计算所需时间和超时时间
  1449. if len(T_pdf2) > 0 {
  1450. r.T_pdf2 = T_pdf2
  1451. clos = append(clos, "T_pdf2")
  1452. //r.T_pdf2_watermark = GetWatermarkPdf(T_pdf2,"T_pdf1")
  1453. //clos = append(clos, "T_pdf2_watermark")
  1454. go GetWatermarkPdf(r, T_pdf2, T_pdf2_stamp, "T_pdf2")
  1455. r.T_reporting_state = 5
  1456. r.T_reporting_submit_time = time.Now().Format("2006-01-02 15:04:05")
  1457. clos = append(clos, "T_reporting_state", "T_reporting_submit_time")
  1458. // 添加已提交状态验证报告记录
  1459. auditRecordJson, err := Task.Add_AuditRecord(r.T_reporting_audit_record, "", User_r.T_uuid, r.T_reporting_state, "", "")
  1460. if err == nil {
  1461. r.T_reporting_audit_record = auditRecordJson
  1462. clos = append(clos, "T_reporting_audit_record")
  1463. r.T_reporting_end_time = time.Now().Format("2006-01-02 15:04:05")
  1464. clos = append(clos, "T_reporting_end_time")
  1465. if len(r.T_reporting_start_time) > 0 {
  1466. r.T_reporting_time_interval, _ = lib.MinutesDifference(r.T_reporting_start_time, r.T_reporting_end_time)
  1467. clos = append(clos, "T_reporting_time_interval")
  1468. // 扣除暂停时间
  1469. Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 2)
  1470. if Task_Compute > 0 {
  1471. r.T_reporting_time_interval -= float64(Task_Compute)
  1472. }
  1473. clos = append(clos, "T_reporting_time_interval")
  1474. // 所需时间 > 超时时间
  1475. if r.T_reporting_time_interval > Task.TaskReportingTimeLimit[r.T_report_type] && len(r.T_report_type) > 0 {
  1476. r.T_reporting_overtime = r.T_reporting_time_interval - Task.TaskReportingTimeLimit[r.T_report_type] // 超时时间
  1477. if Task.TaskReportingTimeLimit[r.T_report_type] == 0 {
  1478. r.T_reporting_overtime = 0
  1479. }
  1480. clos = append(clos, "T_reporting_overtime")
  1481. }
  1482. }
  1483. }
  1484. // 通知 报告人员
  1485. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1486. System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】验证报告 已提交", company_r.T_name, r.T_name), "")
  1487. go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】验证报告 已提交", company_r.T_name, r.T_name))
  1488. }
  1489. if len(T_doc3) > 0 {
  1490. r.T_doc3 = T_doc3
  1491. clos = append(clos, "T_doc3")
  1492. }
  1493. if len(T_pdf3) > 0 {
  1494. r.T_pdf3 = T_pdf3
  1495. clos = append(clos, "T_pdf3")
  1496. }
  1497. // 验证标识内容T_pdf4 ,上传后将 当前任务 验证标识 标志 为 1
  1498. if len(T_pdf4) > 0 {
  1499. r.T_pdf4 = T_pdf4
  1500. clos = append(clos, "T_pdf4")
  1501. r.T_marking_state = 1
  1502. clos = append(clos, "T_marking_state")
  1503. }
  1504. if len(T_pdf5) > 0 {
  1505. r.T_pdf5 = T_pdf5
  1506. clos = append(clos, "T_pdf5")
  1507. r.T_examining_report_state = 1
  1508. clos = append(clos, "T_examining_report_state")
  1509. // 添加已提交状态 检测报告记录
  1510. auditRecordJson, err := Task.Add_AuditRecord(r.T_examining_report_audit_record, "", User_r.T_uuid, r.T_examining_report_state, "", "")
  1511. if err == nil {
  1512. r.T_examining_report_audit_record = auditRecordJson
  1513. clos = append(clos, "T_examining_report_audit_record")
  1514. r.T_examining_report_end_time = time.Now().Format("2006-01-02 15:04:05")
  1515. clos = append(clos, "T_examining_report_end_time")
  1516. if len(r.T_examining_report_start_time) > 0 {
  1517. r.T_examining_report_time_interval, _ = lib.MinutesDifference(r.T_examining_report_start_time, r.T_examining_report_end_time)
  1518. clos = append(clos, "T_examining_report_time_interval")
  1519. // 扣除暂停时间
  1520. Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 3)
  1521. if Task_Compute > 0 {
  1522. r.T_examining_report_time_interval -= float64(Task_Compute)
  1523. }
  1524. clos = append(clos, "T_examining_report_time_interval")
  1525. }
  1526. }
  1527. // 通知 报告人员
  1528. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1529. System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】检测报告 已提交", company_r.T_name, r.T_name), "")
  1530. go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】检测报告 已提交", company_r.T_name, r.T_name))
  1531. }
  1532. if len(T_pdf6) > 0 {
  1533. r.T_pdf6 = T_pdf6
  1534. clos = append(clos, "T_pdf6")
  1535. r.T_examining_report_state = 1
  1536. clos = append(clos, "T_original_record_state")
  1537. // 添加已提交状态 原始记录 记录
  1538. auditRecordJson, err := Task.Add_AuditRecord(r.T_original_record_audit_record, "", User_r.T_uuid, r.T_original_record_state, "", "")
  1539. if err == nil {
  1540. r.T_original_record_audit_record = auditRecordJson
  1541. clos = append(clos, "T_original_record_audit_record")
  1542. r.T_original_record_end_time = time.Now().Format("2006-01-02 15:04:05")
  1543. clos = append(clos, "T_original_record_end_time")
  1544. if len(r.T_reporting_start_time) > 0 {
  1545. r.T_original_record_time_interval, _ = lib.MinutesDifference(r.T_original_record_start_time, r.T_original_record_end_time)
  1546. clos = append(clos, "T_original_record_time_interval")
  1547. // 扣除暂停时间
  1548. Task_Compute := Task.Read_TaskTime_Compute(r.T_task_id, 2)
  1549. if Task_Compute > 0 {
  1550. r.T_original_record_time_interval -= float64(Task_Compute)
  1551. }
  1552. clos = append(clos, "T_original_record_time_interval")
  1553. }
  1554. }
  1555. // 通知 报告人员
  1556. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1557. System.Add_News(r.T_delivery, fmt.Sprintf("【%s-%s】原始记录 已提交", company_r.T_name, r.T_name), "")
  1558. go wx.WxSend(r.T_delivery, fmt.Sprintf("【%s-%s】原始记录 已提交", company_r.T_name, r.T_name))
  1559. }
  1560. if len(T_VerifyDeviceDataStartTime) > 0 {
  1561. r.T_VerifyDeviceDataStartTime = T_VerifyDeviceDataStartTime
  1562. clos = append(clos, "T_VerifyDeviceDataStartTime")
  1563. }
  1564. if len(T_VerifyDeviceDataEndTime) > 0 {
  1565. r.T_VerifyDeviceDataEndTime = T_VerifyDeviceDataEndTime
  1566. clos = append(clos, "T_VerifyDeviceDataEndTime")
  1567. }
  1568. if len(T_BindDeviceDataStartTime) > 0 {
  1569. r.T_BindDeviceDataStartTime = T_BindDeviceDataStartTime
  1570. clos = append(clos, "T_BindDeviceDataStartTime")
  1571. }
  1572. if len(T_BindDeviceDataEndTime) > 0 {
  1573. r.T_BindDeviceDataEndTime = T_BindDeviceDataEndTime
  1574. clos = append(clos, "T_BindDeviceDataEndTime")
  1575. }
  1576. if len(T_sn) > 0 {
  1577. T_sn = strings.TrimSpace(T_sn)
  1578. r.T_sn = T_sn
  1579. clos = append(clos, "T_sn")
  1580. }
  1581. if len(T_CalibrationExpirationTime) > 0 {
  1582. r.T_CalibrationExpirationTime = T_CalibrationExpirationTime
  1583. clos = append(clos, "T_CalibrationExpirationTime")
  1584. }
  1585. // 从3.0获取校准时间
  1586. if len(T_sn) > 0 && len(T_CalibrationExpirationTime) == 0 {
  1587. go func(r Task.Task, T_sn, T_CalibrationExpirationTime string) {
  1588. NatsServer.Cold_UpdateDevice_CalibrationTime(T_sn, T_CalibrationExpirationTime)
  1589. device, err := NatsServer.Cold_ReadDeviceByT_sn(T_sn)
  1590. if err == nil {
  1591. if !device.T_CalibrationTime.IsZero() {
  1592. r.T_CalibrationExpirationTime = device.T_CalibrationTime.Format("2006-01-02")
  1593. clos = append(clos, "T_CalibrationExpirationTime")
  1594. Task.Update_Task(r, "T_CalibrationExpirationTime")
  1595. }
  1596. }
  1597. }(r, T_sn, T_CalibrationExpirationTime)
  1598. }
  1599. if len(T_project) > 0 {
  1600. r.T_project = T_project
  1601. clos = append(clos, "T_project")
  1602. }
  1603. if len(T_province) > 0 {
  1604. r.T_province = T_province
  1605. clos = append(clos, "T_province")
  1606. }
  1607. if len(T_city) > 0 {
  1608. r.T_city = T_city
  1609. clos = append(clos, "T_city")
  1610. }
  1611. if len(T_district) > 0 {
  1612. r.T_district = T_district
  1613. clos = append(clos, "T_district")
  1614. }
  1615. if len(T_province_code) > 0 {
  1616. r.T_province_code = T_province_code
  1617. clos = append(clos, "T_province_code")
  1618. }
  1619. if len(T_city_code) > 0 {
  1620. r.T_city_code = T_city_code
  1621. clos = append(clos, "T_city_code")
  1622. }
  1623. if len(T_district_code) > 0 {
  1624. r.T_district_code = T_district_code
  1625. clos = append(clos, "T_district_code")
  1626. }
  1627. if len(T_category) > 0 {
  1628. r.T_category = T_category
  1629. clos = append(clos, "T_category")
  1630. }
  1631. if len(T_device_type) > 0 {
  1632. r.T_device_type = T_device_type
  1633. clos = append(clos, "T_device_type")
  1634. }
  1635. if len(T_volume) > 0 {
  1636. r.T_volume = T_volume
  1637. clos = append(clos, "T_volume")
  1638. }
  1639. if len(T_verify_type) > 0 {
  1640. r.T_verify_type = T_verify_type
  1641. clos = append(clos, "T_verify_type")
  1642. }
  1643. if len(T_subject_matter) > 0 {
  1644. r.T_subject_matter = T_subject_matter
  1645. clos = append(clos, "T_subject_matter")
  1646. }
  1647. if len(T_temp_range) > 0 {
  1648. r.T_temp_range = T_temp_range
  1649. clos = append(clos, "T_temp_range")
  1650. }
  1651. if len(T_report_number) > 0 {
  1652. r.T_report_number = T_report_number
  1653. clos = append(clos, "T_report_number")
  1654. }
  1655. if len(T_report_type) > 0 {
  1656. r.T_report_type = T_report_type
  1657. clos = append(clos, "T_report_type")
  1658. }
  1659. if T_device_quantity > 0 {
  1660. r.T_device_quantity = T_device_quantity
  1661. clos = append(clos, "T_device_quantity")
  1662. }
  1663. r.T_cnas = T_cnas
  1664. clos = append(clos, "T_cnas")
  1665. if !Task.Update_Task(r, clos...) {
  1666. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1667. c.ServeJSON()
  1668. return
  1669. }
  1670. // 添加任务操作日志
  1671. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "修改", r)
  1672. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "修改", r)
  1673. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1674. c.ServeJSON()
  1675. return
  1676. }
  1677. // 保存电子签名pdf
  1678. func (c *TaskController) SaveElectronicSignaturePDF() {
  1679. // 验证登录 User_is, User_r
  1680. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1681. if !User_is {
  1682. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1683. c.ServeJSON()
  1684. return
  1685. }
  1686. T_pdf1 := c.GetString("T_pdf1") // 方案
  1687. T_pdf2 := c.GetString("T_pdf2") // 证书
  1688. T_task_id := c.GetString("T_task_id")
  1689. r, is := Task.Read_Task(T_task_id)
  1690. if !is {
  1691. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1692. c.ServeJSON()
  1693. return
  1694. }
  1695. // .......
  1696. clos := make([]string, 0)
  1697. // 验证报告内容T_pdf1,上传后将 当前任务 验证方案 标志 为 5 (0未完成 1已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交)
  1698. // 上传后设置方案结束时间,计算所需时间和超时时间
  1699. if len(T_pdf1) > 0 {
  1700. r.T_pdf1_elec_signature = T_pdf1
  1701. clos = append(clos, "T_pdf1")
  1702. go GetWatermarkPdf(r, T_pdf1, false, "T_pdf1")
  1703. }
  1704. // 验证报告内容T_pdf2 ,上传后将 当前任务 报告编写 标志 为 1
  1705. // 上传后设置报告结束时间,计算所需时间和超时时间
  1706. if len(T_pdf2) > 0 {
  1707. r.T_pdf1_elec_signature = T_pdf2
  1708. clos = append(clos, "T_pdf2")
  1709. go GetWatermarkPdf(r, T_pdf2, false, "T_pdf2")
  1710. }
  1711. if !Task.Update_Task(r, clos...) {
  1712. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1713. c.ServeJSON()
  1714. return
  1715. }
  1716. // 添加任务操作日志
  1717. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "保存电子签名方案/报告", r)
  1718. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "保存电子签名方案/报告", r)
  1719. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1720. c.ServeJSON()
  1721. return
  1722. }
  1723. // 修改验证方案状态
  1724. func (c *TaskController) UpSchemeState() {
  1725. Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1726. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1727. if !Admin_is && !User_is {
  1728. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1729. c.ServeJSON()
  1730. return
  1731. }
  1732. operate_uuid := ""
  1733. if Admin_is {
  1734. operate_uuid = Admin_r.T_uuid
  1735. }
  1736. if User_is {
  1737. operate_uuid = User_r.T_uuid
  1738. }
  1739. T_scheme_state, _ := c.GetInt("T_scheme_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
  1740. T_reason := c.GetString("T_reason") // 退回原因
  1741. T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
  1742. T_task_id := c.GetString("T_task_id")
  1743. r, is := Task.Read_Task(T_task_id)
  1744. if !is {
  1745. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1746. c.ServeJSON()
  1747. return
  1748. }
  1749. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1750. clos := make([]string, 0)
  1751. if T_scheme_state > 0 {
  1752. r.T_scheme_state = T_scheme_state
  1753. clos = append(clos, "T_scheme_state")
  1754. }
  1755. if len(T_signature) > 0 {
  1756. r.T_scheme_signature = T_signature
  1757. clos = append(clos, "T_scheme_signature")
  1758. }
  1759. if T_scheme_state == Task.TaskSchemeStateClientReturn || T_scheme_state == Task.TaskSchemeStateReturn {
  1760. r.T_scheme_return_times += 1
  1761. clos = append(clos, "T_scheme_return_times")
  1762. // 客户退回时新增驳回次数和驳回记录
  1763. if T_scheme_state == Task.TaskSchemeStateClientReturn {
  1764. r.T_reject_times += 1
  1765. var rejectRecordList []Task.AuditRecord
  1766. if len(r.T_reject_record) > 0 {
  1767. err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
  1768. if err != nil {
  1769. logs.Error("JSON 反序列化失败:", err)
  1770. return
  1771. }
  1772. }
  1773. rejectRecordList = append(rejectRecordList, Task.AuditRecord{
  1774. T_uuid: User_r.T_uuid,
  1775. T_state: T_scheme_state,
  1776. T_reason: T_reason,
  1777. T_time: time.Now().Format("2006-01-02 15:04:05"),
  1778. T_type: "scheme",
  1779. })
  1780. rejectRecordJson, err := json.Marshal(rejectRecordList)
  1781. if err != nil {
  1782. logs.Error("JSON 反序列化失败:", err)
  1783. return
  1784. }
  1785. r.T_reject_record = string(rejectRecordJson)
  1786. clos = append(clos, "T_reject_times")
  1787. clos = append(clos, "T_reject_record")
  1788. }
  1789. }
  1790. auditRecordJson, err := Task.Add_AuditRecord(r.T_scheme_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_scheme_state, T_reason, "")
  1791. if err != nil {
  1792. return
  1793. }
  1794. r.T_scheme_audit_record = auditRecordJson
  1795. clos = append(clos, "T_scheme_audit_record")
  1796. if !Task.Update_Task(r, clos...) {
  1797. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1798. c.ServeJSON()
  1799. return
  1800. }
  1801. //AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  1802. // 已提交
  1803. if T_scheme_state == Task.TaskSchemeStateSubmitted {
  1804. System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]), "")
  1805. go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]))
  1806. }
  1807. // 已通过
  1808. if T_scheme_state == Task.TaskSchemeStatePass {
  1809. infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  1810. System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]), "")
  1811. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证方案 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state]))
  1812. }
  1813. // 已退回(负责人)
  1814. if T_scheme_state == Task.TaskSchemeStateReturn {
  1815. System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
  1816. go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
  1817. }
  1818. // 已退回(客户)
  1819. if T_scheme_state == Task.TaskSchemeStateClientReturn {
  1820. System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
  1821. go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
  1822. System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason), "")
  1823. go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
  1824. go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】验证方案 %s,%s", company_r.T_name, r.T_name, Task.TaskSchemeStateMap[T_scheme_state], T_reason))
  1825. }
  1826. // 添加任务操作日志
  1827. Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改验证方案状态", r)
  1828. System.Add_UserLogs_T(operate_uuid, "任务管理", "修改验证方案状态", r)
  1829. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1830. c.ServeJSON()
  1831. return
  1832. }
  1833. // 修改验证报告状态
  1834. func (c *TaskController) UpReportingState() {
  1835. Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1836. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1837. if !Admin_is && !User_is {
  1838. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1839. c.ServeJSON()
  1840. return
  1841. }
  1842. operate_uuid := ""
  1843. if Admin_is {
  1844. operate_uuid = Admin_r.T_uuid
  1845. }
  1846. if User_is {
  1847. operate_uuid = User_r.T_uuid
  1848. }
  1849. T_reporting_state, _ := c.GetInt("T_reporting_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
  1850. T_reason := c.GetString("T_reason") // 退回原因
  1851. T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
  1852. T_task_id := c.GetString("T_task_id")
  1853. r, is := Task.Read_Task(T_task_id)
  1854. if !is {
  1855. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1856. c.ServeJSON()
  1857. return
  1858. }
  1859. //_, user_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1860. clos := make([]string, 0)
  1861. if T_reporting_state > 0 {
  1862. r.T_reporting_state = T_reporting_state
  1863. clos = append(clos, "T_reporting_state")
  1864. }
  1865. if T_reporting_state == Task.TaskReportingStatePass {
  1866. r.T_reporting_pass_time = time.Now().Format("2006-01-02 15:04:05")
  1867. clos = append(clos, "T_reporting_pass_time")
  1868. }
  1869. if len(T_signature) > 0 {
  1870. r.T_reporting_signature = T_signature
  1871. clos = append(clos, "T_reporting_signature")
  1872. }
  1873. if T_reporting_state == Task.TaskReportingStateClientReturn || T_reporting_state == Task.TaskReportingStateReturn {
  1874. r.T_reporting_return_times += 1
  1875. clos = append(clos, "T_reporting_return_times")
  1876. // 客户退回时新增驳回次数和驳回记录
  1877. if T_reporting_state == Task.TaskReportingStateClientReturn {
  1878. r.T_reject_times += 1
  1879. var rejectRecordList []Task.AuditRecord
  1880. if len(r.T_reject_record) > 0 {
  1881. err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
  1882. if err != nil {
  1883. logs.Error("JSON 反序列化失败:", err)
  1884. return
  1885. }
  1886. }
  1887. rejectRecordList = append(rejectRecordList, Task.AuditRecord{
  1888. T_uuid: User_r.T_uuid,
  1889. T_state: T_reporting_state,
  1890. T_reason: T_reason,
  1891. T_time: time.Now().Format("2006-01-02 15:04:05"),
  1892. T_type: "reporting",
  1893. })
  1894. rejectRecordJson, err := json.Marshal(rejectRecordList)
  1895. if err != nil {
  1896. logs.Error("JSON 反序列化失败:", err)
  1897. return
  1898. }
  1899. r.T_reject_record = string(rejectRecordJson)
  1900. clos = append(clos, "T_reject_times")
  1901. clos = append(clos, "T_reject_record")
  1902. }
  1903. }
  1904. auditRecordJson, err := Task.Add_AuditRecord(r.T_reporting_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_reporting_state, T_reason, "")
  1905. if err != nil {
  1906. return
  1907. }
  1908. r.T_reporting_audit_record = auditRecordJson
  1909. clos = append(clos, "T_reporting_audit_record")
  1910. // 查询信息采集信息
  1911. infoCollection, is := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  1912. if !is {
  1913. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
  1914. c.ServeJSON()
  1915. return
  1916. }
  1917. // 验证报告客户审核通过后设置结束时间
  1918. if T_reporting_state == Task.TaskReportingStateClientPass {
  1919. r.T_end_time = time.Now().Format("2006-01-02 15:04:05")
  1920. r.T_time_interval, err = lib.MinutesDifference(infoCollection.T_start_time, r.T_end_time)
  1921. if err != nil {
  1922. logs.Error("UpReportingState:", err.Error())
  1923. }
  1924. clos = append(clos, "T_end_time")
  1925. clos = append(clos, "T_time_interval")
  1926. }
  1927. if !Task.Update_Task(r, clos...) {
  1928. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  1929. c.ServeJSON()
  1930. return
  1931. }
  1932. // 已通过
  1933. if T_reporting_state == Task.TaskReportingStatePass {
  1934. System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
  1935. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
  1936. System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,请及时 打印报告", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
  1937. go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,请及时 打印报告", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
  1938. }
  1939. // 已退回
  1940. if T_reporting_state == Task.TaskReportingStateReturn {
  1941. System.Add_News(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
  1942. go wx.WxSend(r.T_reporting, fmt.Sprintf("【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1943. }
  1944. // 已通过(客户) 通知销售
  1945. if T_reporting_state == Task.TaskReportingStateClientPass {
  1946. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】 %s,请尽快安排客户回款", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]))
  1947. }
  1948. if T_reporting_state == Task.TaskReportingStateClientReturn {
  1949. System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
  1950. go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1951. System.Add_News(r.T_collection, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
  1952. go wx.WxSend(r.T_collection, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1953. System.Add_News(r.T_reporting, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
  1954. go wx.WxSend(r.T_reporting, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1955. //System.Add_News(r.T_delivery, fmt.Sprintf("!!!【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state]), "")
  1956. //go wx.WxSend(r.T_delivery, fmt.Sprintf("!!!【%s-%s】验证报告 %s", infoCollection.T_name, r.T_name,Task.TaskReportingStateMap[T_reporting_state]))
  1957. System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason), "")
  1958. go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1959. go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】验证报告 %s,%s", infoCollection.T_name, r.T_name, Task.TaskReportingStateMap[T_reporting_state], T_reason))
  1960. }
  1961. // 添加任务操作日志
  1962. Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改验证报告状态", r)
  1963. System.Add_UserLogs_T(operate_uuid, "任务管理", "修改验证报告状态", r)
  1964. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  1965. c.ServeJSON()
  1966. return
  1967. }
  1968. // 修改检测报告状态
  1969. func (c *TaskController) UpExaminingReportState() {
  1970. Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1971. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  1972. if !Admin_is && !User_is {
  1973. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  1974. c.ServeJSON()
  1975. return
  1976. }
  1977. operate_uuid := ""
  1978. if Admin_is {
  1979. operate_uuid = Admin_r.T_uuid
  1980. }
  1981. if User_is {
  1982. operate_uuid = User_r.T_uuid
  1983. }
  1984. T_examining_report_state, _ := c.GetInt("T_examining_report_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
  1985. T_reason := c.GetString("T_reason") // 退回原因
  1986. T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
  1987. T_task_id := c.GetString("T_task_id")
  1988. r, is := Task.Read_Task(T_task_id)
  1989. if !is {
  1990. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  1991. c.ServeJSON()
  1992. return
  1993. }
  1994. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  1995. clos := make([]string, 0)
  1996. if T_examining_report_state > 0 {
  1997. r.T_examining_report_state = T_examining_report_state
  1998. clos = append(clos, "T_examining_report_state")
  1999. }
  2000. if len(T_signature) > 0 {
  2001. r.T_examining_report_signature = T_signature
  2002. clos = append(clos, "T_examining_report_signature")
  2003. }
  2004. if T_examining_report_state == Task.TaskExaminingReportStateClientReturn || T_examining_report_state == Task.TaskExaminingReportStateReturn {
  2005. r.T_examining_report_return_times += 1
  2006. clos = append(clos, "T_examining_report_return_times")
  2007. // 客户退回时新增驳回次数和驳回记录
  2008. if T_examining_report_state == Task.TaskExaminingReportStateClientReturn {
  2009. r.T_reject_times += 1
  2010. var rejectRecordList []Task.AuditRecord
  2011. if len(r.T_reject_record) > 0 {
  2012. err := json.Unmarshal([]byte(r.T_reject_record), &rejectRecordList)
  2013. if err != nil {
  2014. logs.Error("JSON 反序列化失败:", err)
  2015. return
  2016. }
  2017. }
  2018. rejectRecordList = append(rejectRecordList, Task.AuditRecord{
  2019. T_uuid: User_r.T_uuid,
  2020. T_state: T_examining_report_state,
  2021. T_reason: T_reason,
  2022. T_time: time.Now().Format("2006-01-02 15:04:05"),
  2023. T_type: "examining_report",
  2024. })
  2025. rejectRecordJson, err := json.Marshal(rejectRecordList)
  2026. if err != nil {
  2027. logs.Error("JSON 反序列化失败:", err)
  2028. return
  2029. }
  2030. r.T_reject_record = string(rejectRecordJson)
  2031. clos = append(clos, "T_reject_times")
  2032. clos = append(clos, "T_reject_record")
  2033. }
  2034. }
  2035. auditRecordJson, err := Task.Add_AuditRecord(r.T_examining_report_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_examining_report_state, T_reason, "")
  2036. if err != nil {
  2037. return
  2038. }
  2039. r.T_examining_report_audit_record = auditRecordJson
  2040. clos = append(clos, "T_examining_report_audit_record")
  2041. if !Task.Update_Task(r, clos...) {
  2042. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  2043. c.ServeJSON()
  2044. return
  2045. }
  2046. // 已提交
  2047. if T_examining_report_state == Task.TaskExaminingReportStateSubmitted {
  2048. System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]), "")
  2049. go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]))
  2050. }
  2051. // 已通过
  2052. if T_examining_report_state == Task.TaskExaminingReportStatePass {
  2053. infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  2054. System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]), "")
  2055. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】检测报告 %s,请尽快与客户沟通确定", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state]))
  2056. }
  2057. // 已退回(负责人)
  2058. if T_examining_report_state == Task.TaskExaminingReportStateReturn {
  2059. System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
  2060. go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
  2061. }
  2062. // 已退回(客户)
  2063. if T_examining_report_state == Task.TaskExaminingReportStateClientReturn {
  2064. System.Add_News(r.T_scheme, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
  2065. go wx.WxSend(r.T_scheme, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
  2066. System.Add_News(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason), "")
  2067. go wx.WxSend(conf.VdelUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
  2068. go wx.WxSend(conf.BoosUuid, fmt.Sprintf("!!!【%s-%s】检测报告 %s,%s", company_r.T_name, r.T_name, Task.TaskExaminingReportStateMap[T_examining_report_state], T_reason))
  2069. }
  2070. // 添加任务操作日志
  2071. Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改检测报告状态", r)
  2072. System.Add_UserLogs_T(operate_uuid, "任务管理", "修改检测报告状态", r)
  2073. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2074. c.ServeJSON()
  2075. return
  2076. }
  2077. // 修改原始数据状态
  2078. func (c *TaskController) UpOriginalRecordState() {
  2079. Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2080. User_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2081. if !Admin_is && !User_is {
  2082. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2083. c.ServeJSON()
  2084. return
  2085. }
  2086. operate_uuid := ""
  2087. if Admin_is {
  2088. operate_uuid = Admin_r.T_uuid
  2089. }
  2090. if User_is {
  2091. operate_uuid = User_r.T_uuid
  2092. }
  2093. T_original_record_state, _ := c.GetInt("T_original_record_state") // 1 已完成(客户通过) 5已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人)
  2094. T_reason := c.GetString("T_reason") // 退回原因
  2095. T_signature := c.GetString("T_signature") // 通过后客户签名图片链接
  2096. T_task_id := c.GetString("T_task_id")
  2097. r, is := Task.Read_Task(T_task_id)
  2098. if !is {
  2099. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2100. c.ServeJSON()
  2101. return
  2102. }
  2103. _, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
  2104. clos := make([]string, 0)
  2105. if T_original_record_state > 0 {
  2106. r.T_original_record_state = T_original_record_state
  2107. clos = append(clos, "T_original_record_state")
  2108. }
  2109. if len(T_signature) > 0 {
  2110. r.T_original_record_signature = T_signature
  2111. clos = append(clos, "T_original_record_signature")
  2112. }
  2113. if T_original_record_state == Task.TaskOriginalRecordStateReturn {
  2114. r.T_original_record_return_times += 1
  2115. clos = append(clos, "T_original_record_return_times")
  2116. }
  2117. auditRecordJson, err := Task.Add_AuditRecord(r.T_original_record_audit_record, User_r.T_uuid, Admin_r.T_uuid, T_original_record_state, T_reason, "")
  2118. if err != nil {
  2119. return
  2120. }
  2121. r.T_original_record_audit_record = auditRecordJson
  2122. clos = append(clos, "T_original_record_audit_record")
  2123. if !Task.Update_Task(r, clos...) {
  2124. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  2125. c.ServeJSON()
  2126. return
  2127. }
  2128. // 已提交
  2129. if T_original_record_state == Task.TaskOriginalRecordStateSubmitted {
  2130. System.Add_News(r.T_collection, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]), "")
  2131. go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]))
  2132. }
  2133. // 已通过
  2134. if T_original_record_state == Task.TaskOriginalRecordStatePass {
  2135. infoCollection, _ := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  2136. System.Add_News(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]), "")
  2137. go wx.WxSend(infoCollection.T_submit_uuid, fmt.Sprintf("【%s-%s】原始数据 %s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state]))
  2138. }
  2139. // 已退回(负责人)
  2140. if T_original_record_state == Task.TaskOriginalRecordStateReturn {
  2141. System.Add_News(r.T_scheme, fmt.Sprintf("【%s-%s】原始数据 %s,%s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state], T_reason), "")
  2142. go wx.WxSend(r.T_scheme, fmt.Sprintf("【%s-%s】原始数据 %s,%s", company_r.T_name, r.T_name, Task.TaskOriginalRecordStateMap[T_original_record_state], T_reason))
  2143. }
  2144. // 添加任务操作日志
  2145. Task.Add_TaskLogs_T(operate_uuid, T_task_id, "任务管理", "修改原始数据状态", r)
  2146. System.Add_UserLogs_T(operate_uuid, "任务管理", "修改原始数据状态", r)
  2147. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2148. c.ServeJSON()
  2149. return
  2150. }
  2151. // 进场 改成 方案开始
  2152. func (c *TaskController) EnterArea() {
  2153. // 验证登录 User_is, User_r
  2154. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2155. if !User_is {
  2156. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2157. c.ServeJSON()
  2158. return
  2159. }
  2160. T_task_id := c.GetString("T_task_id")
  2161. r, is := Task.Read_Task(T_task_id)
  2162. if !is {
  2163. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2164. c.ServeJSON()
  2165. return
  2166. }
  2167. // 方案开始
  2168. if len(r.T_scheme_start_time) == 0 {
  2169. r.T_scheme_start_time = time.Now().Format("2006-01-02 15:04:05")
  2170. Task.Update_Task(r, "T_scheme_start_time")
  2171. }
  2172. // 添加任务操作日志
  2173. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "方案开始", r)
  2174. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "方案开始", r)
  2175. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2176. c.ServeJSON()
  2177. return
  2178. }
  2179. // 开始验证
  2180. func (c *TaskController) StartVerify() {
  2181. // 验证登录 User_is, User_r
  2182. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2183. if !User_is {
  2184. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2185. c.ServeJSON()
  2186. return
  2187. }
  2188. T_task_id := c.GetString("T_task_id")
  2189. T_time := c.GetString("T_time") // 进场时间
  2190. r, is := Task.Read_Task(T_task_id)
  2191. if !is {
  2192. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2193. c.ServeJSON()
  2194. return
  2195. }
  2196. if len(r.T_collection_start_time) == 0 {
  2197. r.T_collection_start_time = T_time
  2198. if !Task.Update_Task(r, "T_collection_start_time") {
  2199. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改实施开始时间失败!"}
  2200. c.ServeJSON()
  2201. return
  2202. }
  2203. // 添加任务操作日志
  2204. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "开始验证", r)
  2205. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "开始验证", r)
  2206. }
  2207. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2208. c.ServeJSON()
  2209. return
  2210. }
  2211. // 删除-
  2212. func (c *TaskController) Del() {
  2213. // 验证登录 User_is, User_r
  2214. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2215. if !User_is {
  2216. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2217. c.ServeJSON()
  2218. return
  2219. }
  2220. T_task_id := c.GetString("T_task_id")
  2221. if r, is := Task.Read_Task(T_task_id); is {
  2222. if !Task.Delete_Task(r) {
  2223. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  2224. c.ServeJSON()
  2225. return
  2226. }
  2227. // 添加任务操作日志
  2228. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "删除", r)
  2229. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "删除", r)
  2230. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2231. c.ServeJSON()
  2232. return
  2233. }
  2234. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2235. c.ServeJSON()
  2236. return
  2237. }
  2238. // 列表 -
  2239. func (c *TaskController) Logs_List() {
  2240. // 验证登录 User_is, User_r
  2241. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2242. if !User_is {
  2243. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2244. c.ServeJSON()
  2245. return
  2246. }
  2247. var r_jsons lib.R_JSONS
  2248. page, _ := c.GetInt("page")
  2249. if page < 1 {
  2250. page = 1
  2251. }
  2252. page_z, _ := c.GetInt("page_z")
  2253. if page_z < 1 {
  2254. page_z = conf.Page_size
  2255. }
  2256. T_task_id := c.GetString("T_task_id")
  2257. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  2258. var cnt int
  2259. List, cnt := Task.Read_TaskLogs_List(T_task_id, AdminMap, page, page_z)
  2260. page_size := math.Ceil(float64(cnt) / float64(page_z))
  2261. r_jsons.List = List
  2262. r_jsons.Page = page
  2263. r_jsons.Page_size = int(page_size)
  2264. r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
  2265. r_jsons.Num = cnt
  2266. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  2267. c.ServeJSON()
  2268. return
  2269. }
  2270. // 查询图片生成状态
  2271. func (c *TaskController) DeviceData_JPGState() {
  2272. T_task_id := c.GetString("T_task_id")
  2273. T_remark := c.GetString("T_remark")
  2274. jpg, is := Device.Redis_DeviceDataJPG_Get(T_task_id + T_remark)
  2275. if !is {
  2276. c.Data["json"] = lib.JSONS{Code: 1202, Msg: "暂无图片正在生成"}
  2277. c.ServeJSON()
  2278. return
  2279. }
  2280. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg}
  2281. c.ServeJSON()
  2282. return
  2283. }
  2284. // 生成温度图片
  2285. func (c *TaskController) DeviceData_JPG() {
  2286. StartTime := c.GetString("StartTime")
  2287. if len(StartTime) > 0 {
  2288. _, ok := lib.TimeStrToTime(StartTime)
  2289. if !ok {
  2290. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  2291. c.ServeJSON()
  2292. return
  2293. }
  2294. }
  2295. EndTime := c.GetString("EndTime")
  2296. if len(EndTime) > 0 {
  2297. _, ok := lib.TimeStrToTime(EndTime)
  2298. if !ok {
  2299. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  2300. c.ServeJSON()
  2301. return
  2302. }
  2303. } else {
  2304. EndTime = time.Now().Format("2006-01-02 15:04:05")
  2305. }
  2306. T_remark := c.GetString("T_remark")
  2307. TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度
  2308. TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度
  2309. if TemperatureMin == 0 {
  2310. TemperatureMin = 2
  2311. }
  2312. if TemperatureMax == 0 {
  2313. TemperatureMax = 8
  2314. }
  2315. T_task_id := c.GetString("T_task_id")
  2316. Task_r, is := Task.Read_Task(T_task_id)
  2317. if !is {
  2318. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  2319. c.ServeJSON()
  2320. return
  2321. }
  2322. if Task_r.T_collection_state == 2 {
  2323. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  2324. c.ServeJSON()
  2325. return
  2326. }
  2327. deviceClassList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, "", "", T_remark, 0, 9999)
  2328. if !is {
  2329. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_class 错误!"}
  2330. c.ServeJSON()
  2331. return
  2332. }
  2333. Device.Redis_DeviceDataJPG_Del(T_task_id + T_remark)
  2334. // 生成图片
  2335. go DeviceDataJPG(StartTime, EndTime, T_task_id, T_remark, deviceClassList, TemperatureMin, TemperatureMax)
  2336. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  2337. c.ServeJSON()
  2338. return
  2339. }
  2340. // SyncInfoCollection 同步信息采集表
  2341. func (c *TaskController) SyncInfoCollection() {
  2342. T_task_id := c.GetString("T_task_id")
  2343. T_source, _ := c.GetInt("T_source")
  2344. task, is := Task.Read_Task(T_task_id)
  2345. if !is {
  2346. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2347. c.ServeJSON()
  2348. return
  2349. }
  2350. // 获取信息采集表模版信息
  2351. InfoCollection_Map_List := InfoCollection.Read_InfoTemplateMap_List_For_Data(task.T_InfoTemplate_id)
  2352. InfoCollection_Data := InfoCollection.Read_InfoTemplateMapData_List(task.T_InfoCollection_id, task.T_InfoTemplate_id, InfoCollection_Map_List)
  2353. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
  2354. Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
  2355. InfoCollectionDataMap := make(map[string]string)
  2356. for _, data := range InfoCollection_Data {
  2357. InfoCollectionDataMap[data.T_name] = data.T_value
  2358. }
  2359. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  2360. for _, v := range Data {
  2361. if len(v.T_value) > 0 {
  2362. continue
  2363. }
  2364. if InfoCollectionDataMap[v.T_name] == "" {
  2365. continue
  2366. }
  2367. val := VerifyTemplate.VerifyTemplateMapData{
  2368. T_source: T_source,
  2369. T_task_id: task.T_task_id,
  2370. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  2371. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  2372. T_flow_sort: v.T_flow_sort,
  2373. T_max_time: v.T_max_time,
  2374. T_min_time: v.T_min_time,
  2375. T_value: InfoCollectionDataMap[v.T_name],
  2376. }
  2377. MapDataList = append(MapDataList, val)
  2378. }
  2379. var ids []int64
  2380. ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
  2381. if !is {
  2382. c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
  2383. c.ServeJSON()
  2384. return
  2385. }
  2386. c.Data["json"] = lib.JSONS{Data: ids, Code: 200, Msg: "ok!"}
  2387. c.ServeJSON()
  2388. return
  2389. }
  2390. // 退回记录列表
  2391. func (c *TaskController) AuditRecordList() {
  2392. // 验证登录 User_is, User_r
  2393. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2394. if !User_is {
  2395. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2396. c.ServeJSON()
  2397. return
  2398. }
  2399. T_task_id := c.GetString("T_task_id")
  2400. T_type := c.GetString("T_type") // T_task任务 T_scheme方案 T_collection数据采集 T_reporting报告
  2401. //T_task 驳回记录
  2402. //T_scheme 实施方案状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  2403. //T_collection 数据采集状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
  2404. //T_reporting 报告编写状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
  2405. T_state, _ := c.GetInt("T_state") // -1 获取全部
  2406. r, is := Task.Read_Task(T_task_id)
  2407. if !is {
  2408. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2409. c.ServeJSON()
  2410. return
  2411. }
  2412. var auditRecordList []Task.AuditRecord
  2413. switch T_type {
  2414. case "T_task":
  2415. T_state = -1
  2416. if len(r.T_reject_record) > 0 {
  2417. err := json.Unmarshal([]byte(r.T_reject_record), &auditRecordList)
  2418. if err != nil {
  2419. logs.Error("JSON 反序列化失败:", err)
  2420. return
  2421. }
  2422. }
  2423. case "T_scheme":
  2424. if len(r.T_scheme_audit_record) > 0 {
  2425. err := json.Unmarshal([]byte(r.T_scheme_audit_record), &auditRecordList)
  2426. if err != nil {
  2427. logs.Error("JSON 反序列化失败:", err)
  2428. return
  2429. }
  2430. }
  2431. case "T_collection":
  2432. if len(r.T_collection_audit_record) > 0 {
  2433. err := json.Unmarshal([]byte(r.T_collection_audit_record), &auditRecordList)
  2434. if err != nil {
  2435. logs.Error("JSON 反序列化失败:", err)
  2436. return
  2437. }
  2438. }
  2439. case "T_reporting":
  2440. if len(r.T_reporting_audit_record) > 0 {
  2441. err := json.Unmarshal([]byte(r.T_reporting_audit_record), &auditRecordList)
  2442. if err != nil {
  2443. logs.Error("JSON 反序列化失败:", err)
  2444. return
  2445. }
  2446. }
  2447. case "T_examining_report":
  2448. if len(r.T_examining_report_audit_record) > 0 {
  2449. err := json.Unmarshal([]byte(r.T_examining_report_audit_record), &auditRecordList)
  2450. if err != nil {
  2451. logs.Error("JSON 反序列化失败:", err)
  2452. return
  2453. }
  2454. }
  2455. case "T_original_record":
  2456. if len(r.T_original_record_audit_record) > 0 {
  2457. err := json.Unmarshal([]byte(r.T_original_record_audit_record), &auditRecordList)
  2458. if err != nil {
  2459. logs.Error("JSON 反序列化失败:", err)
  2460. return
  2461. }
  2462. }
  2463. }
  2464. AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
  2465. UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
  2466. var auditRecordList2 []Task.AuditRecord
  2467. // 返回全部
  2468. if T_state == -1 {
  2469. for i := 0; i < len(auditRecordList); i++ {
  2470. auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
  2471. auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
  2472. auditRecordList2 = append(auditRecordList2, auditRecordList[i])
  2473. }
  2474. c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
  2475. c.ServeJSON()
  2476. return
  2477. }
  2478. if T_state == -2 {
  2479. for i := 0; i < len(auditRecordList); i++ {
  2480. if auditRecordList[i].T_state == 2 || auditRecordList[i].T_state == 4 {
  2481. auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
  2482. auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
  2483. auditRecordList2 = append(auditRecordList2, auditRecordList[i])
  2484. }
  2485. }
  2486. c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
  2487. c.ServeJSON()
  2488. return
  2489. }
  2490. for i := 0; i < len(auditRecordList); i++ {
  2491. if auditRecordList[i].T_state == T_state {
  2492. auditRecordList[i].T_admin_name = AdminMap[auditRecordList[i].T_admin]
  2493. auditRecordList[i].T_uuid_name = UserMap[auditRecordList[i].T_uuid]
  2494. auditRecordList2 = append(auditRecordList2, auditRecordList[i])
  2495. }
  2496. }
  2497. c.Data["json"] = lib.JSONS{Data: auditRecordList2, Code: 200, Msg: "ok!"}
  2498. c.ServeJSON()
  2499. return
  2500. }
  2501. // 存档生成图片
  2502. func DeviceDataJPG(StartTime, EndTime, T_task_id, T_remark string, deviceList []Device.DeviceClassList, TemperatureMin, TemperatureMax float64) {
  2503. Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
  2504. State: 1,
  2505. Msg: "图片生成中",
  2506. Url: "",
  2507. })
  2508. msg := ""
  2509. state := 2
  2510. url := ""
  2511. if TemperatureMin == 0 {
  2512. TemperatureMin = 2
  2513. }
  2514. if TemperatureMax == 0 {
  2515. TemperatureMax = 8
  2516. }
  2517. var ymin, ymax float64
  2518. var xminT, xmaxT time.Time
  2519. if len(deviceList) > 0 {
  2520. ymin, ymax, xminT, xmaxT = Device.Read_DeviceData_T_Min_Max_Time_Min_Max(deviceList[0].T_sn, StartTime, EndTime)
  2521. }
  2522. // 创建一个新的绘图
  2523. p := plot.New()
  2524. // 设置绘图标题和标签
  2525. p.Title.Text = "温度折线图"
  2526. //p.Legend.ThumbnailWidth = 5 * vg.Inch
  2527. p.X.Label.Text = "时间"
  2528. p.Y.Label.Text = "温度"
  2529. var chData = make(chan int, 10)
  2530. var jobGroup sync.WaitGroup
  2531. var device = make([]Device.DeviceCount, len(deviceList))
  2532. // 创建温度线
  2533. for i := 0; i < len(deviceList); i++ {
  2534. chData <- 1
  2535. jobGroup.Add(1)
  2536. go func(index int) {
  2537. //go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
  2538. defer func() {
  2539. <-chData // 完成时chan取出1个
  2540. jobGroup.Done() // 完成时将等待组值减1
  2541. }()
  2542. sn, id := deviceList[index].T_sn, deviceList[index].T_id
  2543. ymin_, ymax_, minTime_, maxTime_ := Device.Read_DeviceData_T_Min_Max_Time_Min_Max(sn, StartTime, EndTime)
  2544. if ymin > ymin_ {
  2545. ymin = ymin_
  2546. }
  2547. if ymax < ymax_ {
  2548. ymax = ymax_
  2549. }
  2550. if xminT.After(minTime_) && !minTime_.IsZero() {
  2551. xminT = minTime_
  2552. }
  2553. if xmaxT.Before(maxTime_) && !maxTime_.IsZero() {
  2554. xmaxT = maxTime_
  2555. }
  2556. r_maps, r_maps_num := Device.Read_DeviceSensorData_ById_List(sn, StartTime, EndTime, 0, 9999)
  2557. device[index] = Device.DeviceCount{
  2558. T_id: id,
  2559. T_sn: sn,
  2560. Num: r_maps_num,
  2561. }
  2562. if r_maps_num == 0 {
  2563. return
  2564. }
  2565. pts := make(plotter.XYs, len(r_maps))
  2566. for j, d := range r_maps {
  2567. t, _ := lib.TimeStrToTime(d.T_time)
  2568. pts[j].X = float64(t.Unix())
  2569. pts[j].Y = float64(d.T_t)
  2570. }
  2571. line, err := plotter.NewLine(pts)
  2572. if err != nil {
  2573. return
  2574. }
  2575. line.Color = randomColor(index)
  2576. p.Add(line)
  2577. }(i)
  2578. }
  2579. jobGroup.Wait()
  2580. xmin, xmax := float64(xminT.Unix()), float64(xmaxT.Unix())
  2581. // 添加最高,最低标准线 用红色虚线标识
  2582. p.Add(horizontalLine(xmin, xmax, TemperatureMin))
  2583. p.Add(horizontalLine(xmin, xmax, TemperatureMax))
  2584. if ymax < 8 {
  2585. ymax = 8
  2586. }
  2587. if ymin > 0 {
  2588. ymin = 0
  2589. }
  2590. p.Y.Min, p.Y.Max = ymin, ymax
  2591. p.X.Min, p.X.Max = xmin, xmax
  2592. p.Y.Tick.Marker = commaTicks{}
  2593. //p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"}
  2594. p.X.Tick.Marker = timeTicks{}
  2595. p.X.Tick.Label.Rotation = math.Pi / 5
  2596. p.X.Tick.Label.YAlign = draw.YCenter
  2597. p.X.Tick.Label.XAlign = draw.XRight
  2598. filename := "jpg" + time.Now().Format("20060102150405")
  2599. // 保存文件
  2600. if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil {
  2601. Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
  2602. State: 3,
  2603. Msg: "图片生成失败",
  2604. Url: url,
  2605. })
  2606. logs.Error(lib.FuncName(), "生成图片失败", err)
  2607. return
  2608. }
  2609. if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") {
  2610. Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
  2611. State: 3,
  2612. Msg: "图片上传七牛云失败",
  2613. Url: url,
  2614. })
  2615. logs.Error(lib.FuncName(), "上传七牛云失败")
  2616. return
  2617. }
  2618. //删除目录
  2619. os.Remove("ofile/" + filename + ".jpg")
  2620. msg = "图片生成成功"
  2621. url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"
  2622. Device.Redis_DeviceDataJPG_Set(T_task_id+T_remark, Device.DeviceDataJPG{
  2623. State: state,
  2624. Msg: msg,
  2625. Url: url,
  2626. Device: device,
  2627. })
  2628. return
  2629. }
  2630. func horizontalLine(xmin, xmax, y float64) *plotter.Line {
  2631. pts := make(plotter.XYs, 2)
  2632. pts[0].X = xmin
  2633. pts[0].Y = y
  2634. pts[1].X = xmax
  2635. pts[1].Y = y
  2636. line, err := plotter.NewLine(pts)
  2637. if err != nil {
  2638. panic(any(err))
  2639. }
  2640. line.LineStyle.Dashes = []vg.Length{vg.Points(8), vg.Points(5), vg.Points(1), vg.Points(5)}
  2641. line.Color = color.RGBA{R: 255, A: 255}
  2642. return line
  2643. }
  2644. type timeTicks struct{}
  2645. func (timeTicks) Ticks(min, max float64) []plot.Tick {
  2646. tks := plot.TimeTicks{}.Ticks(min, max)
  2647. for i, t := range tks {
  2648. //if t.Label == "" { // Skip minor ticks, they are fine.
  2649. // continue
  2650. //}
  2651. tks[i].Label = time.Unix(int64(t.Value), 0).Format("2006-01-02 15:04:05")
  2652. }
  2653. return tks
  2654. }
  2655. type commaTicks struct{}
  2656. // Ticks computes the default tick marks, but inserts commas
  2657. // into the labels for the major tick marks.
  2658. func (commaTicks) Ticks(min, max float64) []plot.Tick {
  2659. tks := plot.DefaultTicks{}.Ticks(min, max)
  2660. for i, t := range tks {
  2661. //if t.Label == "" { // Skip minor ticks, they are fine.
  2662. // continue
  2663. //}
  2664. tks[i].Label = fmt.Sprintf("%.0f", t.Value)
  2665. }
  2666. return tks
  2667. }
  2668. // 生成随机颜色的辅助函数
  2669. func randomColor(i int) color.RGBA {
  2670. var colors []color.RGBA
  2671. colors = append(colors,
  2672. color.RGBA{R: 52, G: 152, B: 219, A: 255},
  2673. color.RGBA{R: 230, G: 126, B: 34, A: 255},
  2674. color.RGBA{R: 142, G: 68, B: 173, A: 255},
  2675. color.RGBA{R: 211, G: 84, B: 0, A: 255},
  2676. color.RGBA{R: 231, G: 76, B: 60, A: 255},
  2677. color.RGBA{R: 26, G: 188, B: 156, A: 255},
  2678. color.RGBA{R: 243, G: 156, B: 18, A: 255},
  2679. color.RGBA{R: 22, G: 160, B: 133, A: 255},
  2680. color.RGBA{R: 46, G: 204, B: 113, A: 255},
  2681. color.RGBA{R: 39, G: 174, B: 96, A: 255},
  2682. color.RGBA{R: 41, G: 128, B: 185, A: 255},
  2683. color.RGBA{R: 155, G: 89, B: 182, A: 255},
  2684. color.RGBA{R: 192, G: 57, B: 43, A: 255},
  2685. color.RGBA{R: 241, G: 196, B: 15, A: 255},
  2686. )
  2687. return colors[i%len(colors)]
  2688. }
  2689. // 获取加完水印的pdf
  2690. func GetWatermarkPdf_command(task Task.Task, pdfURL string, flag string) (pdf string) {
  2691. if len(pdfURL) == 0 {
  2692. return
  2693. }
  2694. currentDirectory := lib.GetCurrentDirectory()
  2695. scriptPath := currentDirectory + "/script"
  2696. pdf_file_out_name := uuid.New().String() + ".pdf"
  2697. pdfFilename := currentDirectory + "/ofile/" + uuid.New().String() + ".pdf"
  2698. pdf_file_out := currentDirectory + "/ofile/watermark" + pdf_file_out_name
  2699. watermark_pdf := currentDirectory + "/script/watermark.pdf"
  2700. // 执行Python脚本
  2701. cmd := exec.Command("python3", "add_watermark.py", pdfURL, pdfFilename, pdf_file_out, watermark_pdf)
  2702. cmd.Dir = scriptPath
  2703. // 获取命令输出
  2704. _, err := cmd.CombinedOutput()
  2705. if err != nil {
  2706. logs.Error("执行python脚本添加水印错误:", err)
  2707. return
  2708. }
  2709. lib.Pload_qiniu(pdf_file_out, pdf_file_out_name)
  2710. if !lib.Pload_qiniu(pdf_file_out, pdf_file_out) {
  2711. err = errors.New("上传水印pdf失败")
  2712. return
  2713. }
  2714. defer func() {
  2715. os.Remove(pdfFilename)
  2716. os.Remove(pdf_file_out)
  2717. }()
  2718. pdf = "https://bzdcoldverifyoss.baozhida.cn/" + pdf_file_out_name
  2719. switch flag {
  2720. case "T_pdf1":
  2721. task.T_pdf1_watermark = pdf
  2722. Task.Update_Task(task, "T_pdf1_watermark")
  2723. case "T_pdf2":
  2724. task.T_pdf2_watermark = pdf
  2725. Task.Update_Task(task, "T_pdf2_watermark")
  2726. }
  2727. return
  2728. }
  2729. func GetSignaturePdf_command(task Task.Task, pdfURL string, flag string) (pdf string) {
  2730. if len(pdfURL) == 0 {
  2731. return
  2732. }
  2733. currentDirectory := lib.GetCurrentDirectory()
  2734. scriptPath := currentDirectory + "/script"
  2735. pdf_file_out_name := uuid.New().String() + ".pdf"
  2736. pdfFilename := currentDirectory + "/ofile/" + uuid.New().String() + ".pdf"
  2737. pdf_file_out := currentDirectory + "/ofile/signature" + pdf_file_out_name
  2738. signature_img := currentDirectory + "/script/报告专用章.png"
  2739. // 执行Python脚本
  2740. cmd := exec.Command("python3", "add_signature.py", pdfURL, pdfFilename, signature_img, pdf_file_out)
  2741. cmd.Dir = scriptPath
  2742. // 获取命令输出
  2743. _, err := cmd.CombinedOutput()
  2744. if err != nil {
  2745. logs.Error("执行python脚本添加公章错误:", err)
  2746. return
  2747. }
  2748. _, err = os.Stat(pdf_file_out)
  2749. if os.IsNotExist(err) {
  2750. return ""
  2751. }
  2752. lib.Pload_qiniu(pdf_file_out, pdf_file_out_name)
  2753. if !lib.Pload_qiniu(pdf_file_out, pdf_file_out) {
  2754. err = errors.New("上传水印pdf失败")
  2755. return
  2756. }
  2757. defer func() {
  2758. os.Remove(pdfFilename)
  2759. os.Remove(pdf_file_out)
  2760. }()
  2761. pdf = "https://bzdcoldverifyoss.baozhida.cn/" + pdf_file_out_name
  2762. switch flag {
  2763. case "T_pdf1":
  2764. task.T_pdf1_signature = pdf
  2765. Task.Update_Task(task, "T_pdf1_signature")
  2766. case "T_pdf2":
  2767. task.T_pdf2_signature = pdf
  2768. Task.Update_Task(task, "T_pdf2_signature")
  2769. }
  2770. return
  2771. }
  2772. func GetWatermarkPdf(task Task.Task, pdfURL string, stamp bool, flag string) (pdf string) {
  2773. if len(pdfURL) == 0 {
  2774. return
  2775. }
  2776. // 添加公章 T_pdf5为CNAS实验室 ,不添加公章
  2777. var signaturePdf, watermarkPdf string
  2778. var err error
  2779. if flag != "T_pdf5" {
  2780. if stamp {
  2781. signaturePdf, err = lib.GetSignaturePdf(pdfURL)
  2782. if err != nil {
  2783. logs.Error("获取加报告章pdf失败:", err)
  2784. return
  2785. }
  2786. } else {
  2787. signaturePdf = pdfURL
  2788. }
  2789. }
  2790. // 添加水印
  2791. watermarkPdf, err = lib.GetWatermarkPdf(pdfURL)
  2792. if err != nil {
  2793. logs.Error("获取加水印pdf失败:", err)
  2794. return
  2795. }
  2796. switch flag {
  2797. case "T_pdf1":
  2798. task.T_pdf1_watermark = watermarkPdf
  2799. task.T_pdf1_signature = signaturePdf
  2800. Task.Update_Task(task, "T_pdf1_watermark", "T_pdf1_signature")
  2801. case "T_pdf2":
  2802. task.T_pdf2_watermark = watermarkPdf
  2803. task.T_pdf2_signature = signaturePdf
  2804. Task.Update_Task(task, "T_pdf2_watermark", "T_pdf2_signature")
  2805. case "T_pdf5":
  2806. task.T_pdf5_watermark = watermarkPdf
  2807. Task.Update_Task(task, "T_pdf5_watermark")
  2808. }
  2809. return
  2810. }
  2811. // 暂停申请
  2812. // 列表 -
  2813. func (c *TaskController) TaskTimeList() {
  2814. // 验证登录 User_is, User_r
  2815. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2816. if !User_is {
  2817. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2818. c.ServeJSON()
  2819. return
  2820. }
  2821. var r_jsons lib.R_JSONS
  2822. T_task_id := c.GetString("T_task_id")
  2823. T_task_type, _ := c.GetInt("T_task_type", 0)
  2824. var cnt int64
  2825. List, cnt := Task.Read_TaskTime_List(T_task_id, T_task_type)
  2826. r_jsons.List = List
  2827. r_jsons.Num = int(cnt)
  2828. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  2829. c.ServeJSON()
  2830. return
  2831. }
  2832. // 添加-
  2833. func (c *TaskController) TaskTimeAdd() {
  2834. // 验证登录 User_is, User_r
  2835. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2836. if !User_is {
  2837. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2838. c.ServeJSON()
  2839. return
  2840. }
  2841. dc := Device.DeviceClass{
  2842. T_uuid: User_r.T_uuid,
  2843. T_State: 1,
  2844. }
  2845. System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停申请", dc)
  2846. T_task_id := c.GetString("T_task_id")
  2847. T_task_type, _ := c.GetInt("T_task_type", 0) // 公司名称
  2848. T_aaa := c.GetString("T_aaa")
  2849. var_ := Task.TaskTime{
  2850. T_task_id: T_task_id,
  2851. T_task_type: T_task_type,
  2852. T_uuid: User_r.T_uuid,
  2853. T_remarks: T_aaa,
  2854. T_start_time: time.Now().Format("2006-01-02 15:04:05"),
  2855. }
  2856. List, _ := Task.Read_TaskTime_List(T_task_id, T_task_type)
  2857. if len(List) > 0 {
  2858. if len(List[len(List)-1].T_end_time) == 0 {
  2859. c.Data["json"] = lib.JSONS{Code: 202, Msg: "上一个任务还没结束!"}
  2860. c.ServeJSON()
  2861. return
  2862. }
  2863. }
  2864. is := Task.Add_TaskTime(var_)
  2865. if !is {
  2866. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  2867. c.ServeJSON()
  2868. return
  2869. }
  2870. // 添加任务操作日志
  2871. Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务暂停", "暂停申请", var_)
  2872. System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停申请", var_)
  2873. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_task_id}
  2874. c.ServeJSON()
  2875. return
  2876. }
  2877. // 添加-
  2878. func (c *TaskController) TaskTimeEnd() {
  2879. // 验证登录 User_is, User_r
  2880. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2881. if !User_is {
  2882. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2883. c.ServeJSON()
  2884. return
  2885. }
  2886. dc := Device.DeviceClass{
  2887. T_uuid: User_r.T_uuid,
  2888. T_State: 1,
  2889. }
  2890. System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停结束", dc)
  2891. Id, _ := c.GetInt("Id", 0)
  2892. TaskTime_r, is := Task.Read_TaskTime_ById(Id)
  2893. if !is {
  2894. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  2895. c.ServeJSON()
  2896. return
  2897. }
  2898. TaskTime_r.T_end_time = time.Now().Format("2006-01-02 15:04:05")
  2899. is = Task.Update_TaskTime(TaskTime_r, "T_end_time")
  2900. if !is {
  2901. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  2902. c.ServeJSON()
  2903. return
  2904. }
  2905. // 添加任务操作日志
  2906. Task.Add_TaskLogs_T(User_r.T_uuid, TaskTime_r.T_task_id, "任务暂停", "暂停结束", TaskTime_r)
  2907. System.Add_UserLogs_T(User_r.T_uuid, "任务暂停", "暂停结束", TaskTime_r)
  2908. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: TaskTime_r.T_task_id}
  2909. c.ServeJSON()
  2910. return
  2911. }
  2912. // 列表 - 统计排名
  2913. func (c *TaskController) StatisticalRanking() {
  2914. // 验证登录 User_is, User_r
  2915. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  2916. if !User_is {
  2917. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  2918. c.ServeJSON()
  2919. return
  2920. }
  2921. T_power, _ := c.GetInt("T_power", 0) // 5 数据采集工程师 6 验证报告工程师
  2922. type Admin_T struct {
  2923. T_name string
  2924. T_scheme int // 实施方案
  2925. T_scheme_returnnum int // 退回
  2926. T_scheme_overnum int // 超时
  2927. T_scheme_log string // 日志
  2928. T_collection int // 数据采集
  2929. T_collection_returnnum int // 退回
  2930. T_collection_overnum int // 超时
  2931. T_collection_log string // 日志
  2932. T_reporting int // 报告编写
  2933. T_reporting_returnnum int // 退回
  2934. T_reporting_overnum int // 超时
  2935. T_reporting_log string // 日志
  2936. T_rejectdnum int // 驳回数量
  2937. }
  2938. var Admin_T_List []Admin_T
  2939. Admin_List := Account.Read_Admin_List_ALL_T_power(T_power)
  2940. for _, A := range Admin_List {
  2941. Admin_t := Admin_T{T_name: A.T_name}
  2942. // 方案
  2943. Task_List := Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_scheme") //T_scheme T_collection T_reporting
  2944. for _, T := range Task_List {
  2945. if len(T.T_scheme_end_time) > 0 {
  2946. if is, _ := lib.IsInCurrentMonth(T.T_scheme_end_time); !is {
  2947. continue // 不是本月
  2948. }
  2949. Admin_t.T_scheme += 1
  2950. Admin_t.T_scheme_log += T.T_name
  2951. // 退回
  2952. if T.T_scheme_return_times > 0 {
  2953. Admin_t.T_scheme_returnnum += T.T_scheme_return_times
  2954. Admin_t.T_scheme_log += " | 退回" + lib.To_string(int(T.T_scheme_return_times))
  2955. }
  2956. // 超时
  2957. if T.T_scheme_overtime > 0 {
  2958. Admin_t.T_scheme_overnum += 1
  2959. Admin_t.T_scheme_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_scheme_overtime))
  2960. }
  2961. // 驳回
  2962. if T.T_reject_times > 0 {
  2963. Admin_t.T_rejectdnum += T.T_reject_times
  2964. Admin_t.T_scheme_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
  2965. }
  2966. Admin_t.T_scheme_log += "\n"
  2967. }
  2968. }
  2969. // 实施
  2970. Task_List = Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_collection") //T_scheme T_collection T_reporting
  2971. for _, T := range Task_List {
  2972. if len(T.T_collection_end_time) > 0 {
  2973. if is, _ := lib.IsInCurrentMonth(T.T_collection_end_time); !is {
  2974. continue // 不是本月
  2975. }
  2976. Admin_t.T_collection += 1
  2977. Admin_t.T_collection_log += T.T_name
  2978. // 退回
  2979. if T.T_collection_return_times > 0 {
  2980. Admin_t.T_collection_returnnum += T.T_collection_return_times
  2981. Admin_t.T_collection_log += " | 退回" + lib.To_string(int(T.T_collection_return_times))
  2982. }
  2983. // 超时
  2984. if T.T_collection_overtime > 0 {
  2985. Admin_t.T_collection_overnum += 1
  2986. Admin_t.T_collection_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_collection_overtime))
  2987. }
  2988. // 驳回
  2989. if T.T_reject_times > 0 {
  2990. Admin_t.T_rejectdnum += T.T_reject_times
  2991. Admin_t.T_collection_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
  2992. }
  2993. Admin_t.T_collection_log += "\n"
  2994. }
  2995. }
  2996. // 报告
  2997. Task_List = Task.Read_UserTask_StatisticalRanking(A.T_uuid, "T_reporting") //T_scheme T_collection T_reporting
  2998. for _, T := range Task_List {
  2999. if len(T.T_reporting_end_time) > 0 {
  3000. if is, _ := lib.IsInCurrentMonth(T.T_reporting_end_time); !is {
  3001. continue // 不是本月
  3002. }
  3003. Admin_t.T_reporting += 1
  3004. Admin_t.T_reporting_log += T.T_name
  3005. // 退回
  3006. if T.T_reporting_return_times > 0 {
  3007. Admin_t.T_reporting_returnnum += T.T_reporting_return_times
  3008. Admin_t.T_reporting_log += " | 退回" + lib.To_string(int(T.T_reporting_return_times))
  3009. }
  3010. // 超时
  3011. if T.T_reporting_overtime > 0 {
  3012. Admin_t.T_reporting_overnum += 1
  3013. Admin_t.T_reporting_log += " | 超时" + lib.ConvertMinutesToDHM(int(T.T_reporting_overtime))
  3014. }
  3015. // 驳回
  3016. if T.T_reject_times > 0 {
  3017. Admin_t.T_rejectdnum += T.T_reject_times
  3018. Admin_t.T_reporting_log += " | 驳回" + lib.To_string(int(T.T_reject_times))
  3019. }
  3020. Admin_t.T_reporting_log += "\n"
  3021. }
  3022. }
  3023. Admin_T_List = append(Admin_T_List, Admin_t)
  3024. }
  3025. var r_jsons lib.R_JSONS
  3026. r_jsons.List = Admin_T_List
  3027. r_jsons.Page = 0
  3028. r_jsons.Page_size = 0
  3029. r_jsons.Pages = lib.Func_page(int64(0), int64(0))
  3030. r_jsons.Num = 0
  3031. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  3032. c.ServeJSON()
  3033. return
  3034. }
  3035. // 复制-
  3036. func (c *TaskController) Copy() {
  3037. // 验证登录 User_is, User_r
  3038. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  3039. if !User_is {
  3040. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  3041. c.ServeJSON()
  3042. return
  3043. }
  3044. T_name := c.GetString("T_name")
  3045. T_task_id := c.GetString("T_task_id")
  3046. r, is := Task.Read_Task(T_task_id)
  3047. if !is {
  3048. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
  3049. c.ServeJSON()
  3050. return
  3051. }
  3052. dc := Device.DeviceClass{
  3053. T_uuid: User_r.T_uuid,
  3054. T_State: 1,
  3055. }
  3056. T_class_id, is := Device.Add_DeviceClass(dc)
  3057. if !is {
  3058. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
  3059. c.ServeJSON()
  3060. return
  3061. }
  3062. System.Add_UserLogs_T(User_r.T_uuid, "分类管理", "添加", dc)
  3063. // 查询信息采集信息
  3064. infoCollection, is := InfoCollection.Read_InfoCollection(r.T_InfoCollection_id)
  3065. if !is {
  3066. c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取信息采集失败!"}
  3067. c.ServeJSON()
  3068. return
  3069. }
  3070. var_ := Task.Task{
  3071. T_Distributor_id: r.T_Distributor_id,
  3072. T_InfoCollection_id: r.T_InfoCollection_id,
  3073. T_InfoTemplate_id: infoCollection.T_InfoTemplate_id,
  3074. T_start_time: infoCollection.T_start_time, // 项目开始时间使用信息采集开始时间
  3075. T_class: int(T_class_id),
  3076. T_uuid: r.T_uuid,
  3077. T_name: T_name,
  3078. T_VerifyTemplate_class: r.T_VerifyTemplate_class,
  3079. T_VerifyTemplate_id: r.T_VerifyTemplate_id,
  3080. T_deadline: time.Now().AddDate(0, 2, 0).Format("2006-01-02"),
  3081. T_scheme: r.T_scheme,
  3082. T_collection: r.T_collection,
  3083. T_reporting: r.T_reporting,
  3084. T_delivery: r.T_delivery,
  3085. T_Show: 1,
  3086. T_State: 1,
  3087. T_project: r.T_project,
  3088. T_province: r.T_province,
  3089. T_city: r.T_city,
  3090. T_district: r.T_district,
  3091. T_province_code: r.T_province_code,
  3092. T_city_code: r.T_city_code,
  3093. T_district_code: r.T_district_code,
  3094. T_category: r.T_category,
  3095. T_device_type: r.T_device_type,
  3096. T_volume: r.T_volume,
  3097. T_verify_type: r.T_verify_type,
  3098. T_subject_matter: T_name,
  3099. T_temp_range: r.T_temp_range,
  3100. T_report_type: r.T_report_type,
  3101. T_device_quantity: r.T_device_quantity,
  3102. T_cnas: r.T_cnas,
  3103. }
  3104. var_.T_report_number, _ = Task.GenerateNextT_report_number(var_.T_device_type)
  3105. T_paste_task_id, is := Task.Add_Task(var_)
  3106. if !is {
  3107. c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
  3108. c.ServeJSON()
  3109. return
  3110. }
  3111. // 复制 DeviceClassList
  3112. err := CopyDeviceClassList(r, var_)
  3113. if err != nil {
  3114. logs.Error("复制设备列表失败", err)
  3115. }
  3116. // 自动填写备注
  3117. err = AutoFillDeviceClassRemark(T_paste_task_id)
  3118. if err != nil {
  3119. logs.Error("自动填写设备备注失败", err)
  3120. }
  3121. // 自动填写布点
  3122. err = AutoFillDeploy(T_paste_task_id, 0)
  3123. if err != nil {
  3124. logs.Error("自动填写布点失败", err)
  3125. }
  3126. NatsServer.Create_Local_Table(T_paste_task_id)
  3127. Task.Redis_Task_T_report_number_DelK(var_.T_report_number) // 删除redis内的任务编号
  3128. // 复制验证模版数据
  3129. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(r.T_VerifyTemplate_id, 0, 0)
  3130. copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_task_id, r.T_VerifyTemplate_id, Map_List)
  3131. Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_paste_task_id, r.T_VerifyTemplate_id, Map_List)
  3132. copyDataMap := make(map[string]string)
  3133. for _, data := range copy_task_Data {
  3134. copyDataMap[data.T_name] = data.T_value
  3135. }
  3136. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  3137. for _, v := range Data {
  3138. // 已有值则不复制
  3139. if len(v.T_value) > 0 {
  3140. continue
  3141. }
  3142. if copyDataMap[v.T_name] == "" {
  3143. continue
  3144. }
  3145. val := VerifyTemplate.VerifyTemplateMapData{
  3146. T_source: v.T_source,
  3147. T_task_id: T_paste_task_id,
  3148. T_VerifyTemplate_id: r.T_VerifyTemplate_id,
  3149. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  3150. T_Required: v.T_Required,
  3151. T_Construction: v.T_Construction,
  3152. T_flow_sort: v.T_flow_sort,
  3153. T_max_time: v.T_max_time,
  3154. T_min_time: v.T_min_time,
  3155. T_value: copyDataMap[v.T_name],
  3156. }
  3157. MapDataList = append(MapDataList, val)
  3158. }
  3159. _, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "复制", 0, 0, 1)
  3160. if !is {
  3161. c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
  3162. c.ServeJSON()
  3163. return
  3164. }
  3165. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制标签数据", MapDataList)
  3166. // 通知
  3167. _, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
  3168. go wx.WxSend(var_.T_scheme, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  3169. go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  3170. go wx.WxSend(var_.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  3171. go wx.WxSend(var_.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
  3172. // 添加任务操作日志
  3173. Task.Add_TaskLogs_T(User_r.T_uuid, T_paste_task_id, "任务管理", "复制", var_)
  3174. System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制", var_)
  3175. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_paste_task_id}
  3176. c.ServeJSON()
  3177. return
  3178. }
  3179. // 生成报告编号 设备类型+年+季度+递增编号
  3180. func (c *TaskController) GenT_report_number() {
  3181. // 验证登录 User_is, User_r
  3182. _, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  3183. if !User_is {
  3184. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  3185. c.ServeJSON()
  3186. return
  3187. }
  3188. T_device_type := c.GetString("T_device_type")
  3189. number, err := Task.GenerateNextT_report_number(T_device_type)
  3190. if err != nil {
  3191. c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
  3192. c.ServeJSON()
  3193. return
  3194. }
  3195. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: number}
  3196. c.ServeJSON()
  3197. return
  3198. }
  3199. // 自动填写布点
  3200. func (c *TaskController) Auto_fill_deploy() {
  3201. // 验证登录 User_is, User_r
  3202. User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
  3203. if !User_is {
  3204. c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
  3205. c.ServeJSON()
  3206. return
  3207. }
  3208. T_task_id := c.GetString("T_task_id")
  3209. T_source, _ := c.GetInt("T_source")
  3210. task, is := Task.Read_Task(T_task_id)
  3211. if !is {
  3212. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  3213. c.ServeJSON()
  3214. return
  3215. }
  3216. verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
  3217. verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
  3218. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
  3219. MapData := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
  3220. T_deploy_list := verifyTemplate_R.T_deploy_list
  3221. //if len(T_deploy_list) == 0 {
  3222. // // 解析设备列表备注的布点
  3223. // deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, "")
  3224. // for _, v := range deviceClassList {
  3225. // splitList := lib.SplitStringSeparator(v.T_remark, "|")
  3226. // for _, T_name := range splitList {
  3227. // T_deploy_list = append(T_deploy_list, VerifyTemplate.VerifyTemplateDeploy{T_name: T_name})
  3228. // }
  3229. // }
  3230. //}
  3231. // 循环查询布点
  3232. deployMap := make(map[string]string)
  3233. for _, deploy := range T_deploy_list {
  3234. deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, deploy.T_name)
  3235. var snList []string
  3236. for _, v := range deviceClassList {
  3237. snList = append(snList, v.T_sn)
  3238. }
  3239. deployMap[deploy.T_name] = strings.Join(snList, "|")
  3240. }
  3241. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  3242. for _, v := range MapData {
  3243. if snList, ok := deployMap[v.T_name]; ok {
  3244. val := VerifyTemplate.VerifyTemplateMapData{
  3245. T_source: v.T_source,
  3246. T_task_id: task.T_task_id,
  3247. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  3248. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  3249. T_Required: v.T_Required,
  3250. T_Construction: v.T_Construction,
  3251. T_flow_sort: v.T_flow_sort,
  3252. T_max_time: v.T_max_time,
  3253. T_min_time: v.T_min_time,
  3254. T_value: snList,
  3255. T_start_time: v.T_start_time,
  3256. }
  3257. MapDataList = append(MapDataList, val)
  3258. }
  3259. }
  3260. ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid, 0, 0, 0)
  3261. if !is {
  3262. c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
  3263. c.ServeJSON()
  3264. return
  3265. }
  3266. System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "自动填写", ids)
  3267. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
  3268. c.ServeJSON()
  3269. return
  3270. }
  3271. // SyncVerifyTemplateMapData 根据标签名称同步模版数据
  3272. func (c *TaskController) SyncVerifyTemplateMapData() {
  3273. T_copy_task_id := c.GetString("T_copy_task_id")
  3274. T_paste_task_id := c.GetString("T_paste_task_id")
  3275. T_source, _ := c.GetInt("T_source")
  3276. copy_task, is := Task.Read_Task(T_copy_task_id)
  3277. if !is {
  3278. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  3279. c.ServeJSON()
  3280. return
  3281. }
  3282. paste_task, is := Task.Read_Task(T_paste_task_id)
  3283. if !is {
  3284. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
  3285. c.ServeJSON()
  3286. return
  3287. }
  3288. copy_task_Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(copy_task.T_VerifyTemplate_id, 0, 0)
  3289. copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_copy_task_id, copy_task.T_VerifyTemplate_id, copy_task_Map_List)
  3290. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(paste_task.T_VerifyTemplate_id, 0, 0)
  3291. Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_paste_task_id, paste_task.T_VerifyTemplate_id, Map_List)
  3292. copyDataMap := make(map[string]string)
  3293. for _, data := range copy_task_Data {
  3294. copyDataMap[data.T_name] = data.T_value
  3295. }
  3296. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  3297. for _, v := range Data {
  3298. if len(v.T_value) > 0 {
  3299. continue
  3300. }
  3301. if copyDataMap[v.T_name] == "" {
  3302. continue
  3303. }
  3304. val := VerifyTemplate.VerifyTemplateMapData{
  3305. T_source: v.T_source,
  3306. T_task_id: paste_task.T_task_id,
  3307. T_VerifyTemplate_id: paste_task.T_VerifyTemplate_id,
  3308. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  3309. T_Required: v.T_Required,
  3310. T_Construction: v.T_Construction,
  3311. T_flow_sort: v.T_flow_sort,
  3312. T_max_time: v.T_max_time,
  3313. T_min_time: v.T_min_time,
  3314. T_value: copyDataMap[v.T_name],
  3315. }
  3316. MapDataList = append(MapDataList, val)
  3317. }
  3318. var ids []int64
  3319. ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
  3320. if !is {
  3321. c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
  3322. c.ServeJSON()
  3323. return
  3324. }
  3325. c.Data["json"] = lib.JSONS{Data: ids, Code: 200, Msg: "ok!"}
  3326. c.ServeJSON()
  3327. return
  3328. }
  3329. func (c *TaskController) TaskData_Stat() {
  3330. StartTime := c.GetString("StartTime")
  3331. if len(StartTime) > 0 {
  3332. _, ok := lib.TimeStrToTime(StartTime)
  3333. if !ok {
  3334. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  3335. c.ServeJSON()
  3336. return
  3337. }
  3338. }
  3339. EndTime := c.GetString("EndTime")
  3340. if len(EndTime) > 0 {
  3341. _, ok := lib.TimeStrToTime(EndTime)
  3342. if !ok {
  3343. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
  3344. c.ServeJSON()
  3345. return
  3346. }
  3347. } else {
  3348. EndTime = time.Now().Format("2006-01-02 15:04:05")
  3349. }
  3350. T_remark := c.GetString("T_remark")
  3351. T_task_id := c.GetString("T_task_id")
  3352. Task_r, is := Task.Read_Task(T_task_id)
  3353. if !is {
  3354. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
  3355. c.ServeJSON()
  3356. return
  3357. }
  3358. if Task_r.T_collection_state == 2 {
  3359. c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
  3360. c.ServeJSON()
  3361. return
  3362. }
  3363. deviceList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, "", "", T_remark, 0, 9999)
  3364. if !is {
  3365. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_class 错误!"}
  3366. c.ServeJSON()
  3367. return
  3368. }
  3369. var chData = make(chan int, 10)
  3370. var jobGroup sync.WaitGroup
  3371. var device = make([]Device.DeviceCount, len(deviceList))
  3372. // 创建温度线
  3373. for i := 0; i < len(deviceList); i++ {
  3374. chData <- 1
  3375. jobGroup.Add(1)
  3376. go func(index int) {
  3377. //go func(index int, wg *sync.WaitGroup, p *plot.Plot) {
  3378. defer func() {
  3379. <-chData // 完成时chan取出1个
  3380. jobGroup.Done() // 完成时将等待组值减1
  3381. }()
  3382. sn, id := deviceList[index].T_sn, deviceList[index].T_id
  3383. _, r_maps_num := Device.Read_DeviceSensorData_ById_List(sn, StartTime, EndTime, 0, 9999)
  3384. device[index] = Device.DeviceCount{
  3385. T_id: id,
  3386. T_sn: sn,
  3387. Num: r_maps_num,
  3388. }
  3389. if r_maps_num == 0 {
  3390. return
  3391. }
  3392. }(i)
  3393. }
  3394. jobGroup.Wait()
  3395. c.Data["json"] = lib.JSONS{Data: device, Code: 200, Msg: "ok!"}
  3396. c.ServeJSON()
  3397. return
  3398. }
  3399. // SyncPDFWatermark 同步水印
  3400. func (c *TaskController) SyncPDFWatermark() {
  3401. List, _ := Task.Read_Task_List_For_Watermark("pdf1")
  3402. for _, task := range List {
  3403. GetWatermarkPdf_command(task, task.T_pdf1, "T_pdf1")
  3404. GetSignaturePdf_command(task, task.T_pdf1, "T_pdf1")
  3405. }
  3406. List2, _ := Task.Read_Task_List_For_Watermark("pdf2")
  3407. for _, task := range List2 {
  3408. GetWatermarkPdf_command(task, task.T_pdf2, "T_pdf2")
  3409. GetSignaturePdf_command(task, task.T_pdf2, "T_pdf2")
  3410. }
  3411. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  3412. c.ServeJSON()
  3413. return
  3414. }
  3415. // 复制设备列表
  3416. func CopyDeviceClassList(copy_task, paste_task Task.Task) error {
  3417. // 读取源任务的设备列表
  3418. copyList, _ := Device.Read_DeviceClassList_OrderList(copy_task.T_class, "", "", "", 0, 9999)
  3419. // 遍历源任务的设备列表,为每个设备创建新的 DeviceClassList 并添加到目标任务
  3420. for _, v := range copyList {
  3421. // 读取证书信息
  3422. var pdf Certificate.CertificatePdf
  3423. pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(v.T_id, "")
  3424. if len(pdfList) > 0 {
  3425. pdf = pdfList[0]
  3426. }
  3427. var_ := Device.DeviceClassList{
  3428. T_class: paste_task.T_class,
  3429. T_id: v.T_id,
  3430. T_sn: v.T_sn,
  3431. T_failure_time: pdf.T_failure_time,
  3432. T_pdf: pdf.T_pdf,
  3433. T_Certificate_sn: pdf.T_Certificate_sn,
  3434. T_remark: v.T_remark,
  3435. T_terminal: v.T_terminal,
  3436. T_State: 1,
  3437. }
  3438. _, is := Device.Add_DeviceClassList(var_)
  3439. if !is {
  3440. return fmt.Errorf("添加设备列表失败: %s", v.T_id)
  3441. }
  3442. }
  3443. return nil
  3444. }
  3445. // 自动填写设备备注
  3446. func AutoFillDeviceClassRemark(T_task_id string) error {
  3447. task, is := Task.Read_Task(T_task_id)
  3448. if !is {
  3449. return fmt.Errorf("读取任务失败: %s", T_task_id)
  3450. }
  3451. verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
  3452. if !is {
  3453. return fmt.Errorf("读取验证模板失败: %s", task.T_VerifyTemplate_id)
  3454. }
  3455. verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
  3456. T_deploy_list := verifyTemplate_R.T_deploy_list
  3457. // 循环查询布点
  3458. deviceClassRemarkMap := make(map[int][]string)
  3459. deviceClassList := Device.Read_DeviceClassList_List_id_By_Terminal(task.T_class, false)
  3460. for _, deploy := range T_deploy_list {
  3461. if len(deploy.T_scope) > 0 {
  3462. dcl := FilterByRange(deviceClassList, deploy.T_scope)
  3463. for _, dc := range dcl {
  3464. deviceClassRemarkMap[dc.Id] = append(deviceClassRemarkMap[dc.Id], deploy.T_name)
  3465. }
  3466. }
  3467. }
  3468. for _, deviceClass := range deviceClassList {
  3469. if remark, ok := deviceClassRemarkMap[deviceClass.Id]; ok {
  3470. deviceClass.T_remark = strings.Join(remark, "|")
  3471. if !Device.Update_DeviceClassList(deviceClass, "T_remark") {
  3472. return fmt.Errorf("修改备注失败: %d", deviceClass.Id)
  3473. }
  3474. }
  3475. }
  3476. return nil
  3477. }
  3478. // 自动填写布点
  3479. func AutoFillDeploy(T_task_id string, T_source int) error {
  3480. task, is := Task.Read_Task(T_task_id)
  3481. if !is {
  3482. return fmt.Errorf("读取任务失败: %s", T_task_id)
  3483. }
  3484. verifyTemplate, is := VerifyTemplate.Read_VerifyTemplate(task.T_VerifyTemplate_id)
  3485. if !is {
  3486. return fmt.Errorf("读取验证模板失败: %s", task.T_VerifyTemplate_id)
  3487. }
  3488. verifyTemplate_R := VerifyTemplate.VerifyTemplateToVerifyTemplate_R(verifyTemplate)
  3489. Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
  3490. MapData := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, task.T_VerifyTemplate_id, Map_List)
  3491. T_deploy_list := verifyTemplate_R.T_deploy_list
  3492. // 循环查询布点
  3493. deployMap := make(map[string]string)
  3494. for _, deploy := range T_deploy_list {
  3495. deviceClassList := Device.Read_DeviceClassList_List_ByT_remark(task.T_class, deploy.T_name)
  3496. var snList []string
  3497. for _, v := range deviceClassList {
  3498. snList = append(snList, v.T_sn)
  3499. }
  3500. deployMap[deploy.T_name] = strings.Join(snList, "|")
  3501. }
  3502. MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
  3503. for _, v := range MapData {
  3504. if snList, ok := deployMap[v.T_name]; ok {
  3505. val := VerifyTemplate.VerifyTemplateMapData{
  3506. T_source: v.T_source,
  3507. T_task_id: task.T_task_id,
  3508. T_VerifyTemplate_id: task.T_VerifyTemplate_id,
  3509. T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
  3510. T_Required: v.T_Required,
  3511. T_Construction: v.T_Construction,
  3512. T_flow_sort: v.T_flow_sort,
  3513. T_max_time: v.T_max_time,
  3514. T_min_time: v.T_min_time,
  3515. T_value: snList,
  3516. T_start_time: v.T_start_time,
  3517. }
  3518. MapDataList = append(MapDataList, val)
  3519. }
  3520. }
  3521. if len(MapDataList) > 0 {
  3522. _, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, "", 0, 0, 0)
  3523. if !is {
  3524. return fmt.Errorf("保存布点数据失败")
  3525. }
  3526. }
  3527. return nil
  3528. }