From ae20ab86a0216ff14ba85d08ac83d8bd3715adb4 Mon Sep 17 00:00:00 2001 From: 18188916393 <2562295436@qq.com> Date: Mon, 1 Aug 2022 14:10:50 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E7=BB=9F=E8=AE=A130=E5=A4=A9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql index f6af1a80..d35c359f 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql @@ -153,7 +153,7 @@ AND DATE_SUB( CURDATE(), INTERVAL 10 DAY ) <= date( start_time ) GROUP BY run.device_id - LIMIT 10 + ENDSELECT ENDQUERY ENDIF From 20d6197c77b92399a7a0539d4e73905f6ab96978 Mon Sep 17 00:00:00 2001 From: liuxy Date: Mon, 1 Aug 2022 14:53:44 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes/qd/src/views/wms/mps/produce/index.vue | 173 ++++++++++++++++++++- 1 file changed, 171 insertions(+), 2 deletions(-) diff --git a/mes/qd/src/views/wms/mps/produce/index.vue b/mes/qd/src/views/wms/mps/produce/index.vue index cba88d07..1a436dc5 100644 --- a/mes/qd/src/views/wms/mps/produce/index.vue +++ b/mes/qd/src/views/wms/mps/produce/index.vue @@ -154,7 +154,7 @@ :title="crud.status.title" width="1200px" > - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -374,6 +514,7 @@ import ViewDialog from '@/views/wms/mps/produce/ViewDialog' import crudClassstandard from '@/api/wms/basedata/master/classstandard' const defaultForm = { + tableData: [], produceorder_id: null, produceorder_code: null, producedeviceorder_code: null, @@ -591,6 +732,34 @@ export default { this.crud.notify('下发成功', CRUD.NOTIFICATION_TYPE.SUCCESS) this.crud.toQuery() }) + }, + insertDtl() { + this.form.tableData.push({ + produceorder_id: '', + produceorder_code: '', + producedeviceorder_code: '', + shift_type_scode: '01', + workprocedure_id: '', + produce_date: '', + plan_qty: '', + real_qty: '', + report_qty: '', + material_id: '', + material_code: '', + material_weight: '', + planproducestart_date: '', + planproduceend_date: '', + realproducestart_date: '', + realproduceend_date: '', + order_status: '00', + is_needmove: '1', + order_type_scode: '01', + material_name: '', + device_id: '', + is_canupdate_update: '1', + material_spec: '', + sale_id: '' + }) } } } From 52a06fcc0eb9ecf0d6215c2223543b8fc31debcc Mon Sep 17 00:00:00 2001 From: liuxy Date: Mon, 1 Aug 2022 17:18:00 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes/qd/src/views/wms/mps/produce/index.vue | 143 +-------------------- 1 file changed, 2 insertions(+), 141 deletions(-) diff --git a/mes/qd/src/views/wms/mps/produce/index.vue b/mes/qd/src/views/wms/mps/produce/index.vue index 1a436dc5..2050342e 100644 --- a/mes/qd/src/views/wms/mps/produce/index.vue +++ b/mes/qd/src/views/wms/mps/produce/index.vue @@ -154,7 +154,7 @@ :title="crud.status.title" width="1200px" > - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From e17321fd0ed2dd5fcde21da8d181eb1d58ddbd6b Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Tue, 2 Aug 2022 13:21:19 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql | 7 +- .../mps/rest/ProduceshiftorderController.java | 52 +-- .../impl/ProduceshiftorderServiceImpl.java | 1 + .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 255488 -> 254464 bytes mes/qd/src/api/wms/mps/produceshiftorder.js | 10 +- .../src/views/wms/mps/produce/AddDialog.vue | 287 +++++++++++++++++ mes/qd/src/views/wms/mps/produce/index.vue | 304 +++++------------- mes/qd/src/views/wms/pdm/device/index.vue | 46 +++ 8 files changed, 455 insertions(+), 252 deletions(-) create mode 100644 mes/qd/src/views/wms/mps/produce/AddDialog.vue diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql index d35c359f..9cd4d67b 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql @@ -68,9 +68,12 @@ FROM pdm_bi_devicerunstatusrecord run LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id + WHERE + run.status_type = '05' GROUP BY - run.device_id - LIMIT 10 + run.device_id + ORDER BY err_num desc + LIMIT 10 ENDSELECT ENDQUERY ENDIF diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java index 781d9ab8..95863ed3 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java @@ -15,12 +15,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; /** -* @author qinx -* @date 2022-05-24 -**/ + * @author qinx + * @date 2022-05-24 + **/ @RestController @RequiredArgsConstructor @Api(tags = "工单管理") @@ -34,24 +35,35 @@ public class ProduceshiftorderController { @Log("查询工单") @ApiOperation("查询工单") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(produceshiftorderService.queryAll(whereJson,page),HttpStatus.OK); + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(produceshiftorderService.queryAll(whereJson, page), HttpStatus.OK); } @PostMapping @Log("新增工单") @ApiOperation("新增工单") //@PreAuthorize("@el.check('produceshiftorder:add')") - public ResponseEntity create(@Validated @RequestBody ProduceshiftorderDto dto){ + public ResponseEntity create(@Validated @RequestBody ProduceshiftorderDto dto) { produceshiftorderService.create(dto); return new ResponseEntity<>(HttpStatus.CREATED); } + @PostMapping("/addRows") + @Log("批量新增工单") + @ApiOperation("批量新增工单") + //@PreAuthorize("@el.check('produceshiftorder:add')") + public ResponseEntity create(@Validated @RequestBody List rows) { + for (ProduceshiftorderDto dto : rows) { + produceshiftorderService.create(dto); + } + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PutMapping @Log("修改工单") @ApiOperation("修改工单") //@PreAuthorize("@el.check('produceshiftorder:edit')") - public ResponseEntity update(@Validated @RequestBody ProduceshiftorderDto dto){ + public ResponseEntity update(@Validated @RequestBody ProduceshiftorderDto dto) { produceshiftorderService.update(dto); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -69,7 +81,7 @@ public class ProduceshiftorderController { @Log("工单下发") @ApiOperation("工单下发") //@PreAuthorize("@el.check('produceshiftorder:edit')") - public ResponseEntity submits(@RequestBody JSONObject param){ + public ResponseEntity submits(@RequestBody JSONObject param) { produceshiftorderService.submits(param); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -78,23 +90,23 @@ public class ProduceshiftorderController { @Log("根据登录用户设备下拉") @ApiOperation("根据登录用户设备下拉") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity getDevice(@RequestBody JSONObject param){ - return new ResponseEntity<>(produceshiftorderService.getDevice(param),HttpStatus.OK); + public ResponseEntity getDevice(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceshiftorderService.getDevice(param), HttpStatus.OK); } @PostMapping("/getTable") @Log("获取工单生产记录") @ApiOperation("获取工单生产记录") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity getTable(@RequestBody JSONObject param){ - return new ResponseEntity<>(produceshiftorderService.getTable(param),HttpStatus.OK); + public ResponseEntity getTable(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceshiftorderService.getTable(param), HttpStatus.OK); } @PostMapping("/openStart") @Log("看板开工") @ApiOperation("看板开工") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity openStart(@RequestBody JSONObject param){ + public ResponseEntity openStart(@RequestBody JSONObject param) { produceshiftorderService.openStart(param); return new ResponseEntity<>(HttpStatus.OK); } @@ -103,7 +115,7 @@ public class ProduceshiftorderController { @Log("看板报工") @ApiOperation("看板报工") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity saveReport(@RequestBody JSONObject param){ + public ResponseEntity saveReport(@RequestBody JSONObject param) { produceshiftorderService.saveReport(param); return new ResponseEntity<>(HttpStatus.OK); } @@ -112,7 +124,7 @@ public class ProduceshiftorderController { @Log("看板强制完成") @ApiOperation("看板强制完成") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity finish(@RequestBody JSONObject param){ + public ResponseEntity finish(@RequestBody JSONObject param) { produceshiftorderService.finish(param); return new ResponseEntity<>(HttpStatus.OK); } @@ -121,15 +133,15 @@ public class ProduceshiftorderController { @Log("获取当前报工记录") @ApiOperation("获取当前报工记录") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity getReportWork(@RequestBody JSONObject param){ - return new ResponseEntity<>(produceshiftorderService.getReportWork(param),HttpStatus.OK); + public ResponseEntity getReportWork(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceshiftorderService.getReportWork(param), HttpStatus.OK); } @PostMapping("/forceFinish") @Log("工单强制完成") @ApiOperation("工单强制完成") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity forceFinish(@RequestBody JSONObject param){ + public ResponseEntity forceFinish(@RequestBody JSONObject param) { produceshiftorderService.forceFinish(param); return new ResponseEntity<>(HttpStatus.OK); } @@ -138,8 +150,8 @@ public class ProduceshiftorderController { @Log("获取当前工单下的工单生产记录") @ApiOperation("获取当前工单下的工单生产记录") //@PreAuthorize("@el.check('produceshiftorder:list')") - public ResponseEntity getDtl(@RequestBody JSONObject param){ - return new ResponseEntity<>(produceshiftorderService.getDtl(param),HttpStatus.OK); + public ResponseEntity getDtl(@RequestBody JSONObject param) { + return new ResponseEntity<>(produceshiftorderService.getDtl(param), HttpStatus.OK); } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java index 3b4a8d31..385659c7 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java @@ -124,6 +124,7 @@ public class ProduceshiftorderServiceImpl implements ProduceshiftorderService { JwtUserDto currentUser = (JwtUserDto) SecurityUtils.getCurrentUser(); Long deptId = currentUser.getDeptId(); String newCode = CodeUtil.getNewCode("PDM_SHIFTORDER"); + dto.setProduce_date(dto.getProduce_date().substring(0,10)); dto.setProduceorder_id(IdUtil.getSnowflake(1, 1).nextId()); dto.setProduceorder_code(newCode); dto.setProducedeviceorder_code(newCode); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index 2238c4664f97b41617cb1350af082d5bbf2ddffe..155ba657d8278aa9598995ae17b06deed396e1a2 100644 GIT binary patch delta 51834 zcmeIb2|yK9`#*lp%w-1!6j|Ix5ZU3f$l}J1;D!sSnJFlsBnlyxOM20$Y*(ikTQ%P@ zODod^GgC~;h&&=NAzxEgvAq|n|8BBtqT>i!IrC)1@QWl{RU_6nRKhtTmr?W&2f3&r=$wqMi zKd2T{on}D%AM!I|x+}&lgtN`xyL9mC24za{eH=$c>d&)kRKw5LTK0WNpr6k>wbEa+VSt!rdlJ@!@ z{xnoB>4v|Q{qp0-x+21V0kLk^3xq-rTFo~X^js>MA|clw+Pn#Q0owx~Lr3LH}+pNt5g-tuarpZrWjw0sWEQswgzg9Fo8bPyqPeS9*c z42d}NA)6)-86?T`Q#!izV-$gMaf&|;l8d7vX$B;(U7!An`zy8|7RA{Qx$5Ge_;qo}-wwy7oDw8Lru)dzS)nfc+*_`T^Mh{i zmcxw^a(rCA%CG==S(Km0IZlt=E_>&6mMarF$$R4_n6OT#gz$D{u#QEx+Lg`e_3L^{ zXkS;}X2{=;?U+CCD63rrPY~z;hl1@gN|R3;2h)CXWPF^wJRv}KOAnB5kI$Fq<@m_I z4D^z}jgMq<&nh=p6G2Vx6B6QF20>Lof@JTQ2-<)1iiARgT+rV~c2Dt=pBvN#Iyz9^ zIM`2)Nr{#tQhen*quu41kqI!sfZy`VDbX}d{xW59U@B{o1ib}Q z%MxLQpA!Pw;e+JUX_I^KYC(0!>s42di|ukPtA%bf6sCi-O6cIM5_b3?`AEMTq34J6 zzZbgTc>g%YUZ6znC5H`|AYY#n0Pz!2y31|(k@Bel#d2m;H#sIMK%O&jA{*=HK;dj0 z6fAEWBnY$*Qvqh>#wAM?Z{6Vo0<|K=KVE+fvCOnW z)WSKRgXHQ+e=nPnDtC+NF24u5QxoBl{r%*D>7DyJRCcVo&^%Au=JkV96v$BdrNQo~ z+EC&l3}T@hgsnOLa$CA@0nZt7fQqn>4TE6V>gWsBCVO0-kP*kU4<#^jn5&nYj}9IW zlLb)XXczEfQ#$g7!y0bs23uTJGWj|MpjyJN(Mw=8($s>Ham3Fug*9g?%_PtFwDQvtg5e?cay#wf$K}d0u9K z?2{d!>NFjO%URiRJ+OhN1YoQ^+X4SVkgFoQgnXeBtx6h-xi`26a!YjQL3jY3g2e!G zMZpMcaIPq9@j-G>&SW;yaCG6gRB|FM=TZLh&L~g$tDJJx@&-ZkgXEgrCiR@DUO$^b z;q1lShyL<|>D}eHJoI#oc@dysx8)5sr^1qY4vqx9Fl2C?3-4}sd3Cy9F4v3NC|2_V zt}q`$8+ck7fUB)l{UxpJMC`yo4wq}ELd@p%2 zXfE`({Bo~|BOy;Hh?D6MBdaqG=XRc4)Splp^1*`c^1LBNQv@`Rq9!o6iSvi!FrU)J zC3IYD_{r&EShu4`?FzVAyISWjLASyPW*@b~ct+M1i6;OAGD2?#bvu#dFNTbj_YR5N zoHjIE2ux?O?Ykyjot!(P_@9*qTj@ZXR9IGyy zHFd#FcaB4BR2;`X8bRmwx(=}pWOgEABAvc8c%k29q{>g{R6XZBIpUXb8FLY%HaF4M8p~E*%Lu zyKnQ=8)l29o`jzDH4x}sm$U8=3Wh1w6SIFA{A0omzlJOYE;iI+|EO>9Xadf`-gq6#(JbHDDoNzGmrq5yx{^HCDZ)dq5FLIr^B5PgptR>a8 zA^Q#!&i^Wynq_454NLPp>C^QV43 zq2Ik4{7j4g_~g>5BOmry`tYdWsvFMu?dZ5qQSLEGbsuDH@W}Y=i5dPSL7m2ZeCqda z#o9EtmwkKJMs2)5u5Z5%OYT_j9@=q+TXfFsCq~?S@W|EI&53#cSYVGHw+{Pt%-O-+ zp4#8BU`SB?ti*=A%qhy(OCJ5AHt6Bco{Bm<@T)CPb|1RGbMzy3O&ieT@Z5f5Z#DKC zl`ym7zF|X-ogdcQH?Z(s(Xmzfukrfr`qAAwelEKFJnVSrZ*zWrf7^!2oXOF>*PI!d{QHBm zr+zr&&D2`&--FKA9t@uU#aopTu?_AKug+TB`Sqym8hlm5*8yCeO# zFFJ3kJ-Bqplk>jpeY`=qCBx0zP`=o??#Z5pa(ZBEm^Q5Y*Y}rx9C6m=o%N;{`=7Y+p)>c-ALH^} zV$X3uURU~Mc+aBe?t1ma)_#BVyZwjN^Sz`l`xjJfdUT+e7`JAn_hMD_7`{G^iuwb_g6w*Z$*8#sqpBoNp~OY_vH(*w@l7nuzvUU zjyDWC^g!C&wR7s0?`?ip`1QrXZSxP`V+vUm(LAr)ck`la_Ix(4N7G^-D{bBB?Sx;^m)4O0?$?A~wZ}trtdSv16>(aBXdA-!7>vdy}TqB*YoqFiylvPV> zlCxuW9X8CE=VDqo==%YKuPN*i_Ri6yZ9&g0`k?2j52hc!e{0+rSy;N)T%%BZgd_UXB3LafOo^l;d^&%3i#?+et*Y?e|e_5FIz%>-nmTtI%)Gqn|*t4I@U^+Rz)!M_!Y+S z@32Vy8-_Th;oAmZ)DX4vlu@qKe{+Z9&8eo;hq-^d4?_4SU#=!(2WXhE#|Zfq!nF|2 z2WPAM8nF5hHbQuZGa=jlMaVragj79FNH!?yAqAicKZNjk z2xmS+NG3SD&pb=WVlYzTbA-GL;VcNVI)U|pa0`Sf8wv5~Ovqyp&VjJY^Uyd5Z-#K3 zA0aq~^()e|z_P6*VE#O)yDGhlbhPC~vF2&ry{c>r*9{w_ii zfRkCTKtoM%Fm^W~9e|bfuYs!$tm?6kkfXq&9tR)R4Sp^LtN1>9?kc4-E6VQ-b zjzKpJgqEy*kB~{wlC{SngqF0uPe>EAq{D}V0N2Ud6VS)df@e<>G88Pt^R0080$TF% zDd+-dK(~*8Lm(5QJ|^TFXvnBfA%wo)`xzmn(2&|M2=Rf2EdP>_Sm@G^z9OU!8Z`3^ z8ARNnCF{Qd=LA~P{VWI;v?TBx2paTN;CTq4MJvA}q%XAO-tP&ChL*Jc0BnbrjBdKk zk3Q(>{TV5LcFO$9v=jF~koC(W$9gF7!8F``f*U2bdQp<)tr!dFNSdlFE}(_Lz*I_M z98h8)m{92yLbFT@`7DnTH>enXgboCnO5)fFG={he-VAYr^bDjO83v4iX_hSp%xH%J zW7=Ujvt(&aa6r@yfm7`Wfhp}UU{E^@n9>e|u5O2QwZlxG+d zOwz%6>0rSihc=0ShgmK%e-~r)4$=kAD0zk2{<)GJu)c-tx5e?y6||l^!EV?MoehH; z@^FScc2nCwo`(yR-!5vmnhEyNZVKYhGVyen33i)p=6J>{g59^9U82N_bZVbRHz35; zV4t?jMEM|;&hFH#ruQXXfgQ~h{*)`m~17qHxy(qwV^s# z9~~@A2MgE1BCN4Vs&q$MgDMuKgGK9LF*;Z*$CO3kG{VA)a4Ww2VtoRW-#Y{MQ0%N7 z!0l)vkXNbsPx&%}MtSYA0Q6NQIFi1ibc>=!<>N@uA*YAYF3OZBn&Z6L7vw3xTDO4A zrYeQev^#ZD&K1y<5HN_UK0*EB27iIh9id22UvTaYf8|P3H0|kE?rwphZd?s1??=-_ zKihu8v|dn3NDK|L>r&9f7-gfJa0J+6sEF(_sAxM3m7YBvm?sOSbt$NL3#fJ}jvD*K z$aH%Q%t1R0H89XA&ll2818v&_#)7!mwGj+QI}8UL&?%ty?Xv)T(vBRgWjhS)4a;H_ zWMRc=)GPSG%l;@sSUQC>%bzpTJ=hKVfEk#8C`?RJo2jz|OA&6B)A zwZB76-f8p=4=bgKRqAC|6k@?TScndW-imcKF)ey4_859AW~^yqE0UeJ$rWegdt=lM7Vn z)4rB?SK`_QW?bAX^@=Y9_K}a~Df148R6!dSpYn zWQn(^k+KoAC#aEIM$rEM(Nd4-*of1WluOt&z(rKt=)1~Gqv#lVOzAk97D6z2G|h(KUp)AX2T@}Hd{3#u;JC7R3=N_0EAR5)S03~% zVqi7~A1Ko>IIi5u!RL7J77u>H-~*-WRg5GZgZGuGJh%;m50v#7yr~?<;E3`a5B$fn zv;I7o%!8YG@Z?xJIl?l;FQFHexN$I6jwprWSdOzXc&kYnM~8swokEFm4ka6JqvZGl zluXzF19k^E0xfWn={>8FJ+$eetLcSa@rgc@%rg%h&54~Y=UmBI&QZy2R`x8Q>Ag0G zSztE;_QGwFSrs$TgN+Mme{)NC$>^zB5_1d{ zu|0-1+a5!kZI7YNwr>fpyO`-Zs7*%u3!pN05lxFYL9Ydt?qK$kk`vV7U(@kL^d0wz z59wr;z6Oj)A?LyqWrJ~+<7$9?wlO+btPU1ujhR&T8m&PUi?_iNDUQwr8;n;b(FWsm zNj4a#>#KvAl6Alo9V}G`OVh#nG0b+j^w*&qz_F%2%V~-;2*^ZLK%y@pAh#;i#{l$! zs9rz-`(A>+`61e5FHo6Kc1OEedzKECZG~w9m7{~@a!mQ)v33GgphG@H2OFw`4b#Df z>tG|SF-@QftwB|wMgnFpwWDk>E9ux3bPJ2JwNAHka+}uPrh_fj!EV>V z?y$x*A-dBVRE6U%9qeu$>>eHLUL9H{ zI+(&S*bR;!b-j2c2W_wibg&0?u!nT8hjp+=Y_MMZ^4+60Ajej5tm&?O^gR^O6HqO* zeYajh;!JcE-YNoO^G25s^_q-0a$qK8Z zkFl|_nPXgTHSh%;!Yw*jqYl=jgKcG)=FahgU$mh!ad4Xr$g!7nuGa27|!)0dFis4(ecC-_QXMajYrzE1Hga z<0+M+uU>+qtIyDdPIR}@<2%~V=>gYINR4v$cQjim{tm8cHe?6|9S1_r;lESzo3B8O zy#*y6c1pm!7&c4{Rd)YKH#K}uf6L4OHHEjvW_Gy)Ek*Rpq-iuvxLt*o31wq{W|yB+}W~Zh>H~E zR_CyCN)nZW0fJ?!(6P( z7(#hsS8Gtk+;lK^9n6Dc%E3UP(7fg_iIwFIQG{ycbIivEGckqaYlA(^FkDL{RBPka zEWgfHblTANv!WwiRQ273foJg-9O<3P#voyRe@i{I1?dmz9ngi^YJ|hJ1^QuALsvm@ zp$Sc~AwpM!=|%bybQR{(1-kY{ig)xSATQCyP&~(-$aWQXhNA>1mE$ht zWfgY?`j^=-_?~uw>+3I3%ij)a^JlU>{jZ;yY-;mgFMh}0-TtfoBkgZ`FhYoMvNIRG zK!UUdhdNk7MRO6XgN5i|y>+lqhH0aU=hw%Y&ZHI+W(}%XxK82-9lA&zEJ_E9*1=3M zR-iVZ}*o(Ua8SU(?ulVU%-+R(h{W9}D!#t}vln z)0-(mwJQ~suj_>H4jtG6IfdH=;K*5-n<32b_-3#`TCNtzH>Ebl71!oJ?iGrc>&oGx zAt*9-k&&&>cd(qJ>D#QVm@0&rO$A>og^F02zALr(uBm*UpR;ut9n=+m)gCHYr9v1u z3fGki{Ufx_y_bzQFY9D#stz1e4wVX1%`M@xOf*uKbq-!K8Yz1WZInIcuY(2XV1d?{ z){-C&Dm%)Au&K5!$LrhnW#JWbYfLkWr)dH+L#SpbISq3_2Y(7I(SO(!I!!p}8gZJY zs);&ZJW*3nwGd+f`b?F+$0g{iYlTp1W-(_cYDMd+Yg*ABL#=3!p;okDe5j&Uv|zjp zRDfn|h}!L_0nMO_p$4?aPy^ayr~v^}Cfy(ujw`frmCo> zKW-3Uihr68SNR%talSUr7o4ygMyTY*i<39SE)tH4jn~pSw8^kUFj8M|iQ6ds9BSg} z(?`gFP+5Jm5TF#-3kGG+?Sgkly!Hm0z2S>A(aOmtp}Qq|6ke*+qJ=tivD@G=C~a-) z02OFkTOEY>VG;0y$9OFXJF7eFU%)W3?wp{-Z&Wht;mJC98laTb3q8Bn0R>J&5z0_Q zJg$S|t;%EdP@U6Fg0IqYyWqLJ+Ms+~FSNvj3t1VFz?22V2!BolCh(uxq z9*?ocrc<{Flc{VpIQO7kpj*)6+yjZ}I8Hs4bGHkD%d4j=+m;G< z_+u=kXcMg4AFh<#E_C(MnuRX5x&0?ZCG}>ZCGy0!h5a^3-7z!;_tU(;fiC?>cf|gX%AmImg9zkj0-l+^2^84 zS^SFkqN5STi7xXjSmZXLQnJ9ss>|-tQw|{tsCLI=f0+%t6>xdQ!-`% z=8a}c|43Q=n9#+P1owlckxcl_fvcivB!(TOkUTg_BH1L1q%h1#64_BAAV!i4XW2lL z21iMdvM=~I3jj%h8@97qK8cWL3{Ygjd7_$E0?@_)o(QQD;3%7F~Z{d3^Sns71wAzeX`K$v$6&zj2aIDp@|22#)NEV zDyHJ*9CJ3Vp!G3kF3{G&7e5s@=e3JpX%mlwgMU2L^mrz*)Pxk*=MOh$U|rAR`XOfA z)vEr*^~21#HNB_L2qD9!UChdLc47r-R&Jzlp*@Xad_r(GagvPsd~^2554D<5&(UVw zy4d3SA_w?b2l#kh+|vM7I#oIMxX{&NgB#Wg&K_FTZxH5QEPB4M^4XAlkL z+s1ds6)??1@${(`j4)TQI5`;@xfL3zN?+Sj1jv2R|0uRr-KmP@F`%`Gb&jBHcuELh zgCnE|XH5sxuRML~gz=v3hDs}}>1*tte+l-(Z90D&`w!>}T1NffuE8?x*{_Wudt84A zdHU2VtDaS7#u9eGO6Vl5M{cw05#_gMg#c#Q&~f^2T9AYPRQ_k%^ZC#6|1RN}a{WeC zC9xhD3Cnw04~*tLz}!)^>K2|C*B>(T#9CPv*S9#pkC<^=kJDoPZSl7q&>yv!2ipY4 z93(jI0Jn&wZ38sxY-MWaN!X91iPb6 z8NNyA$oyE=Ujg2h{u=ea{$d<}pTDucRtVZmA1l+Q#JphLU#)6iVt68Q_ksQGZ9v;*NNBP1ZEPex-N>%_Ju7x3rX?l}XL4cG)RK`efB#}Ip z7NSWbR8T@{6OdDt+y@fC${70~iUrRD_O1qG286i$rWL%8QDH{Tq^hQ5YGoO(TA7M# zbXXa!f*56~U_Vwt(o}IOtDR5UJZ$(4_Wpv&zD)5Nds=^)c3b zHQ*A^Vt=9l;s^IxqQqc)9UNCcI2XbO10RogWokN{x5C$xZ2sZE_LrVJ{7UmPJI@0E zAGl&AK>NAW*MZ=n^siLIjcT}04O=1H0KyhVGK5xmwzUu8qw0mXwj57BvU%sz2eva# zg%McRf~w-^kbqVq6NFx5B77$aI7;w?v51F~iCqK=cS}1{i4+T28B^d4Kds7Z=V7Z@ zE40I#NRm`BtF&ycG*GILVx)L%5WXZql5%I2N(JTZ8OD0FYV&bH8E{#{76a^H7CAn1u_zY}^U;y^1LotZr>S0d$hdFEuHX0S#X(;I#i{5`IN zmKF=)WV+C*Z2M8@-T1w*ol>|GlMNmzq{6sL;4L)#tqo5b5F@Z{jheDF?p>9YhK&VRyiN`akk76nn+j6<|sInZ5OVRZhny(o?q2qn5&ymgoHP#2`@PD0yW)^DH{yTEooPv0n*i}>6+Da z22xs6IvZ2523nP8va}Er)~gAZLPBT}b7v%idj$B7T+D!RK+V{j?Ehu+{+3tX{_)+T zjfdX)cE`tR*|v2~Ai`CBi)e8_IapDg}9POtR-P3UC0z=}eaAhTM5JqEJ%g`=+_qZkW;QJUIX z32N*?Rk&6{OCJT{LhNA{W@W5qaY&E(eGa|U3de4Y#oX%v*0TH>p_Hq}=xJ!@X7dLr?E~hvO}PpEuw@1_#*%e*@r`f4IMy4_cX$a8LtlRmK9l z(4(cmpwYl{X0w517Hx=X9CaV3;=}%8w9e2E-OcnDr|eEda&>pG5%|%HaFisBJk9FN zEBiFGL?DmtxP{q2ckr0Fx3q!ToiOsa(5M{xL+~G}HIy@8D{E^QX@s^ut+v}bD-;%+ z0(N2n$Q__kjBP@o6YlhGRYtT4VPY%sP^2{RD)1o=wZZ;_*85|{aSS!~6JyvxaX)b& zJ6Nq9wDuFXK!R_mn8G4j`inE!LB;?v*GXbEKP`v@p&%d9sPq=a5R)dw*e>K0v<~)s zO4*}xGmCPiqRcGtS|ldrED=;V9I9%e&3cm^Al<#esm9q`9%RKuFHdEJ=6F-cf!ES;UeG&?(LN@X z6fLrTv79slSjP*+hK+V!<|j12MN47Xg~P5IJ|c{DSu+#Ie$HZ)ABrP3WrLZ2 zn0mgmI4Xsw_8?Y?nZRIbi$u0hEVzh$ot|Yy3~&L7|8w~uKR<_M37mp+h4q&@Qtb)o zN7J9^$ZA$F4zE0@zcxfs4qbG+6kRCn$Ppl?yqZ{X93gH*8c|pzjks!av%*oBmylPmHW!O5-ORGG{#S}JnSAzNAHFGDDmQk2CelM007gVbZ z+4MXg@zG^^F__H6{>@h2%`$} z!OC0A$>?IpR^PhvDlz2?o(xt1+YljHGX^=yi{$YJi0?01P}WL!5loOW!b7ZrV26h| z7=k}?#1seyd5Uom%<>cq26IOUT_o&V?9H_{gA;WDT0u*#7l3Ns< zNQ@M@vz8BGg8?_ppq|5qSv)Xwfi|KLfEBa%z4n=LTi>hIj9d9$!I04fH3FS4Yv0Qo z#$_vUQ;L5F&-lC{oSk~K^RhA+?hZJ*XcjMPJj2oZLa)r?W#MoKpACLhFAa{cJzLeV zMGa9OwZe0VA^q<=OdoDNci?4|Rb0|}jfn=b40~D%*ZS5XHjZSTE4OySbrIR(-k91? z7t7We+%^%uSH>H&ZD=E|uwu(m%VD@y<-k^``Cs$HOz4Mk<>X3YVhY(BsjZ-D+C-xh zfKF3hXyEnLie4Uk&^bf;m)GrD!}8z@yN)tJ6Y5O1>_HK>&k)Bk&(MYBHv$%rBCrbWYrry44)}f7|V0h-}tEHj2SL^4= zn+9HuNy{)ST(@v8QjU8D{aRi@lx4l1v1N-by+2Xj@D_WdSh!;w@2GFk5rFcP`JKdZ z(HH9l+w1~}(&8fqbhqcS4V9A6S&TCANi+8zW0}jwi$RA|FFEIvFX8Oem@4UTl^15w zS-O)Cn6-oLSlN}E^DyvcG@oB{l6Zk^x!7DLiiI|!E&i~zJB-d2j*rI$%s&mN~nAzZq8Ia3=#v#_6H_a{P%{4jpG0~2o=cMoWdO`PU4r_QA&U$!;7t0SN z9dqqX_6Z`SfU61RBrJ^2+PM6*259mFn#5dy6#mz;r$o(LIqMIzSlbzZHUU5>8*eVw z(P+eK{hQvh3GQXb=?I@&zXrXB#=-;I$v!vT6ozvMYggsc9`$Otn-TNjmAlvoZ6qeW zwsBk8-o?&m8EeibU!l=A=bD`GnTIz^hn()DHB4=t6dD#0*50b&VCNbmlqFCW28rP| z>oGhQK=PTBaAguUk7~*CASfOUu^N9Y@(X!p+$$Uw4JY2~F-Slb-QV7Oqf_gb*&z zvfBnw@~mrxlY}~m(VO(FG~>3Do{eVQZql<)jj*5ev@+a0>AAp8+fRDDVP{7x@YR0O z6VCAVlb#H~&l|?G-)i=|6n^=KD-4~v%-_AVY`RjD8SF{DxeIT(!?omYmt0J)v`k{0 zU~++1c&tT`J1$%?{JWEvB%&-!6O+2x=Wm&f#1Q3dni!Mat_rA1P-S|ODP_|tW=SQr zRWmE5+Gk|ZlwFBZ-B0YQH1`x;x>!_?g`g)M$Q?nFo>utlI~UUk{Pup+%liRw4Q8@(F@F;F=ni7o;51@hv8iPG9% z3?78VS<0Zq+82g3V_ns*RXLm}BL|4#8)mCHuwf`$)(h}kVdJspQQEq`y;<%d z4Z)&QD&})BbE-{!(do@+IbsKf@*I@nV9|vsu}f#coLnzUm8_jy^wPQM#p?VCXBRyU z<%FN;r8>NIP=MLt)iz>XPM#Kb_X@52;!?i8AHiovwoCY1)oUAn#?ig_%CG6FVVdK2 zX@~V<4lvA<#uXIhn|;(U^E~OIF0iSc4-7I7Nwo>oKDcPX#|!u$HU;3g!7jUK_U&>f z%%$WrDik%vCsgb*3uX0UV-3ss_t%BFgR71zlk{hO+ht$?FW0x#YmBXHJHoPjoXRrB zHd-wog9^UX>M@KeR-s0C6BKIlaOIgkqPvv>wy63DW(;}{h=A23er3R-@?6N|oXnz3 z9beemcLWt4H&*O(jYXOASgi_|>svbVhu6ZjJzTBs%e}gbxo_6%EvmnzM2CxAb=))w z)@0F5!~17iLGh{^3E1Yq2E%IR(&)Ku5{SK?+m>p^ZQVA!w%0m@EpA)+ZQwyoR}}lH@BCzTMj&7dh-jI^DuHiXoXw*N4CN9Zd#Qd zX>2orL1}3du7&ds(c(A=V*9a6Ig|Q{>2UTa4^H$Gn_v@xK{-psz5pNU&n^ND8o(|B z?T8f%L{O@VdmPMOv~@kbEdnS4T#uvf(Os!y3w5p(>Fl-%FeecPG=4y@JDBvFv@L?_ zx*VUZZDj?c;{R*g1m?2zyh8RqN-Ok*Cpq}(OE2LjNM(jWbmvxh$#SXr%J>_9@&fTh#xTAcfm?qr z1{(+Q7B+%0v-mEWEIIZqIAhiPlnx1^KMVr6z#O6!B#53SRRYdze+#eiJ-_wcHCivC z!~rj|3x^NSh3g7xwZM8YX9h0LIdBI(%#_?YvgBv&{Ht!b@Hbu1zAyl}c{$5(+PVzV zw_k1B$nvrCNQPa8OEOojz$GteE0IZJq2B?x?#w+u+_J~(bmPnf!E|=o-ZfxzD;Q1oD?KY2eS6nnBjD!^``B+Q`@I0a{PT}>4X*Ge!h=k;vlXBJ zjEmsHU4;J=ramJPmBJM?^=A__9sk!%{YI8v-_&#WN;Bx)^{4Xc#W$tJPwc9$K;%Q7 z<`oESOZla&`9Ekg;as?D=Km9(L8FPZzYd3pwVB0Lt))gyiokqpm-@_Jr(;in?@U9D zZn@5IdAF^2Ux_z)wWaYe?n-L; z{K(U28ITny^sp%7uwuAc#HnD@!bPbJ?6N8?U?V@JK3we8K=gah$)@R@j4}Kd4cHYuR-idV(asjo>J#jZrveb;feCogj3%(j~wsTJn zTh#D#H3ZpY@d0XRRKt8VEQauE%wVnxEQ7EWt}NTTa_bo01-vlaq4@66re9xp7SlBY z-bi4tQQ6eWlA1D`3ongIkMW|vo3_5zs0{Tyr`VI#sy&=f|FLk+P%_w~UVVoTkjrP>{Aw&a|e zw`e7!KW@hv$8%;h46tkuA2cG!36V%f2QAYtmcSh`V~2?2BGl9l5?hu78kM6%#GV)3 zxOfzrFOj1l4?#o45Fc&Cg#m<;+^CEgDu&MFt7fpYQ&L*WZPcZz5Jrx%40ux=FA9Z` z4;UREvv5-j@l=Wpq93eLSvG%tAlQ1FxM;$iT`dOXbJk?*jqiBZEncHT=}Ya6jXVZ@ zMIl7~s9v%F z?TIQ{-A7agm$fU(?JhR6Td+(JWxst0JN07QhO{EM)y2lU2J^<_nS60idNuF4cth5x2~)!W{pSyyDszi(eJz#9&@ zs{N@ffjZl;uh?JV+uU!cK>2R`sF= z_rw@6!r_MWzhZ(l$@mjSSg=@OZAXe`X|-J^{KCbbvBJyP{`3Ec75)NZ1jNQ`me6VV?n*Bz^M=Pi)b(t^sD;*18%2M=P1HhQ(?)R}Gi> z5)&g>rvlAtcuWn?s-Y`9-VHO7Ak?$2sSIy#T}J}$a0UyWVZ|&ZWW4D6-<-xavn}4( z0S?Wq?KE~7OW=4KTMhA7*3AB2p2m*sqAAl$m|1*SiM9;N?Xu%3X>am1OoMSyaWA^P zKj1hmAA07M5zBOTogdcJY;M&DqS%g9>*?%VM*kPhZK^h(buc5nd`|0eyP7bECt<2uxQnIbVy#P4cNpHB%gH2D> zFhdRTJ`lvK)o`gAu2#dXYS^NNpBKS_p23A>Y{1(a+yKD;8Pi!@1?T*9XlHGvv$%>b zk&8@cFTk?uQ#CkFqA?DBtRg1gntY?rU- z1edMoqe&VMci>?-62i;0%m0KaZ;{TFmy(Q2PkL=G?WV#$du+TBLa@uq$mwD?`mHi^ zx)^UtN=?g5%}IcluchXsdKPZvYfISL&XgZzS(nT*H*dCteAgiPEN&4c%}0m;0?9*)wF9bt5q}GhqcuW%N(4trTvX{_gLyNyK2S=&zoH;;ukv)l#JP8HZ3S`mV)7_*ul;9 zdqS&=rkBmy?VKr*9gBvce(6>cmLhuc57P4 zI|Fjv_vMpr!BViatQQ+e{&gLJZfO3|Z6fWXS3jdqdi8^GNUAE2NCTuTw$x_%y)8Ns&M0@h` zXC*`y2yHvXz?cU%XJQE(beCw3Qf_Ktjc*623I_jKP@aXKt zG%Q^VE+4guCi(>Dub|^y6Vu1JW{=zNypLAjvkY1!g&lbDt=)^mcC~mvf5yxGRhRhK zF}-W&t$DC~<_eNysv%X?IaN2#8dhPLUF&0%!ruL28#%o5{Lw83_DW+i>CJtPZb>s_ zwRS6Q&aSGQGjrCm!i zQL_8c(_4-od1-6wj|YF)v$LS%UhiebgHl*l@1JNw>@V~-YKly}n}!LS%a*N?!UN^- zC@FrFYc@PC+4tBxk9fI9r4N)6y=sD_@7B=O_=sfhmKHDfHvvt$^J6-Vgq<4z4@drP zz|H3}HVyD{A2+>XqvUaKqSQZpf=fhfcG<|v%Gu%G&e6^8v1DvX<(x8Uz@Xox;F9oV z&dH4}PK#HXihF%l8A&wb8)t$VuDv4qr19kvONS8++|P{6NPG9W!5_;uIgz(a$jAS5wfOpuQdb-2Bp=KAF(b z?{{avq;w}&KP10?hP&U6#5naV)+ssCsZI3DuI_B?Jc_g?htTg5Mv?xOOIX?YXm-%(A<7?JO)nyEySwd!&X3eRst(rxeCe0Gpq$r)P zp?w;zrM=*-vhIreTJbukyTB`fSIe#yO|)G3d9Ap>1DAs)8{h|CL8ZP{HdcA%Nio>l z7+SfKX`mtG=BWp6Mt}B~b>jaNPFM{VDyE_Z+0|j@ND4~XSc6Ii3 z6MTO!SbgWUlz0k51_gcK5Z?q}v4xE;H-1h*H$>lEnCxl&V z^XzrS{;m+&*5(dz+N&bI6`YC4BKrog7l#Bv%C@#{kg~0<2c(4eZ^GLE+S)=OkspMX zPXyq8n6#6d2V8u`Zdjz8n@ATo)oc=%Qj;g7=l}(JL+A_N&H^zeWykc*%7d4y#v9|a zVzP1`&+S{6o0(acomA)KoUk;vZsoL^60pvB6_sVPrSQ2VH92A;XzZDWs#&7j#NicF zLDS5xDzBA5Q^HoO(usw6d88maH$Hjd@G;GWu{pzrh1}+S^GJ9=RD5!*Q7W857w?gV zRZOWVsmYrM&uXMyh)bO?oQ%n;2m9|#!ST&xPtB4_7op0N?yfN!7ls(Szfu#@>{&-1?Q0}Yd)2w!)l4!2@)E#B zO3vvUACuQNnWV)eCFbOTV-%l|9TT6GoJEq-;?r{bX64eQ$yd!TtC>A<1Sy0k#fB}4 zpGY#Rt8+?fOD2+GRZ~kUCl-~Fnbi|>=T0rFGzFx_8Z$~?NsTR=+oLqU?45yiA$88N7mRO;<_^#m|FJ!(gCXLQ0E6**hsNG#LdK7uEoaB<`in?8io@7Z~hx(xj zNqysAOUWOyY)5=-!p%FDKeYIbdneXZRn<%_%7ISdy0EE0y?yft_`> zwx-HdIXNXGIjd7q3hcmLP6B7w2ZEEAnw^@HloFFh@)E&U%t}h8#nZBLVv=%=X#~8* z%*3SZG|z=0w+4nJR+i1Gs=uM?T*BC_+==z!g;@#D_^^e#s-7V(QlQ z2&RjL=qa8b$&taqhNv|paE)uxbW$-JOfgvE)m1YFlK@F9THWD}iq_h3!8gnxQ(DRD zD)54XzHv(U#i>`7Z>UJfOy6fuzB|L0Zki&c&6Lt4?XL^KqZwk+VNq5=sJ}G_A^mw}OypDYrcI<2FNKCy)!rRmz zo!8NOlM4()_E8>b5`&aoO=5b(0Wp9|O5g!8EaYIxCLE}32JqzFKzFVasg?j>XSj?P zt&Dn6?4%@b6=!+Cx)6ae2rqGoQ2w=5e1`VH$i>!p)0;1fq10_0DJ0{7E=g(I1}g{6Lr~n#CCK6DkFbosm3!{O(mN_0?vz!O-oPj|BM@jH* zR@!&l^u0sB)1f3=VgCMnQKk|@~HwY42Q$$Q!ex|p=jDuHD+L?^4hYF5g$ zSKxlUP{s6$=m%{YszaKhtbax90W=3*5xWA-Fddo*<+oSF-Z7#3>>JaU)nK?zl5dsa zyTu;fywYfaDBTFHP~P7oW-PBxRX*A+PG4RfpbXt3dMdx%E_g4m?xvXbh_1?yw+o$@ zS9k7!jn+(8fPil+4_aP5Ug`R(D4Etg*E_Z0qs{qS7q!*=GEdsX3IHArxpv=@FJJj2 zqv?^?>wBNNXRU^RU45Uh^^2p~ch-D&p!d@&_GtLh50*3+&IrhU=%KI(@7t>G*6<%2 zPe1#cuV2BcN2YiUC>Ru^;T;No`El&nkJ9t+oEAkzkJv~pBKxd6|8;Yesm9qY)s^adi*VaZKtuZc2k*eBM~XO%hoz)jnz{D8qhWzK%l=R{@08{$ipDANy#amd{V4vDcC?mr|>!bA~= z#cOCU<(9+ZaFKNArMz=k94$Z?(E{<&)0Ep=#0U|5No7k5Bn03S9ya;CDSjn192GMf z-iAuPrObI-G&voGYIRqBep_5XKT_trBbq!v2IN*%9Vr<{#jkVwruEHA%1O@Z8*lv$ z_Hxe|nKdxj7;j9BhbZk2@WI&wgEP}Iv$Arsa`|6UeA9w=#ak%6+TOkKJ<%x87nJz- z#gHM@P#WAmPnN>h6TbJs7nCbm4PU&_umQf%deD%Bzy==XXqL{qksTxbh^i@-Wnq;S z<+aL#?~BQ9br1fw8(m*f_HhbnI023QK&*B83MfBT=6wLI{8stl18DajfK;HLG*oH6 a8T{gw#|2lVQ9`n}L<-%7puk7YEEVHyP(6=PdfAn%cA*n zLqohRt3swyuh&|2)%l$RQV&uA`4RFUwG3+;+=>cx$@mdN;z$dEu`R5z3mju9q}>g2 zvb39>V?C|07aU^=@v?FbZ0D434{L0?b8Ihb?49V{gH``0%;93GDVToO3kiZyq0TTNfYG)}8@6*1ci`Y1hTkh!iPjgqNv<|fh@%*T^ z7g~kMAHppaoyJ;Q_|M_lz=hnLY|z3D#~&(81DBi3SfL+*;h&tbrJEtPRTS{G?-zU| zL|g7R^vR4-V^;(Q%HFa!(Y0hP9NU0TnX<3_zV<|y!f>OC{{ScKsJ8rI=xm9P=pB~; z*Y-JeWoZ&s9P;42cpgcXwGpvq=YHFZrEl@$y69 zErIw20klqtJ)UCO5E<*nV=d;$5X(=I87ZkiLrEy;_rO4tWRi#*AF!z;j^p#}@ia!? z%uGcS;qEkV>uojB7!iMHC-YtG%Ca$ z^SdClh3jBT?~E26ad6d)ka?D0(mT^Mix3qXhO90Kt!zZ{WObDWB3%$b)OnV-(mT6% z2ePZc`AWZZ%d)5t%a{E^+r|Nc+*Fy>gq*UXYmjArd<#ojw6PVhyfCLqO19h|9m`5{ zRRBxaHAuWFgkouFGfQr_Ad!+*7Gn%Y;aZ@?GO=4rfI|Tew!Gb=nVDB9$e*f+p|lIf zp9x}JQ71f!h zSPsNaR2nD3;t?CkO2K-OgH$|sXK8uqBAhC;8)QTYNDFeY!>%@idrNvsh@R0~{L`aNJsg|!&Cbq)nU}L$E)e#|XoF>&WDYXwxwroi4MUQ-qUh1Z6Yfaj$#;7p)9*G zT4GpYV_L#MY{rHj)&Y3c(IL z*`Z7tlCg?$#4Y1Yv5LC%vi1)6;CKlwVARM! zZ325nJOT6@Q;_9_t}R&CRZUxm3?r-T3xag3`Wp2Em`JE<=zC~R&!;z23{Ze&X!jt? zjEolT(e}AEZA=le@iDY}sO40K0s8OH8LHybXb?+AW-QZg7X+wy$7X?If5{YLklU9m z-tuA3R*3=N9DsYk^%5V{s09L@a2TH|ZmGyS{O8ksESIvTSjK{DQIuV6xihDoWnzkt<)z*};~7`QN%3VKfzpJSn+9&Hac${s zM<~aWEjx4ifR<LlkC#TKsXSt?3;kToo*TH{UE6HA#u)!0}7|UF|hHk}U zd$Uw9wjCOp^1TzP#<-p1LYZ!Do#{9%DfAnsQ>S~}>0%=Ijx_3OUx!yxWMSkMx5 zE7RIsJzduPz6FzB@3TH&FR3S$fTJkl{QD1{SnZOGe|0py2d z9hndG5?b5ozWx^;3|yw?E3=V?8AKJ$I)%RbvSJvU>oSD#ZE=9fR4FmBw@xrd{6h1L~~ zzHr2&bmobKr;dNtV@cH8chpo}*Uzu%J}Umvv9EibsF*!x!r_j0m;WRF=}Q%#u1G$Y z^tk&E&wg)~W}LeI>4)zJRi%~qTfSeq=iY6*?|dU<)xL+r-`tb#`+Dc$k$aB4+hfJR zz7ISe1Br>ePzA&{rs!>{Wm_HH74l(!xztfa=q8;ZbjY|LNimVT3Scm z_Wk@a?NV10+G@#j$A9rX89%sr^})i!a{!hWev2)-6veqXMSbmyl}k9^U0TI~mK zjrc4puh*;F(vGLMoxJqHmyRBLy~nUwg|Egey#M}6>3r8~ceOq2VcvE$x4?H}Z2z`T zF5KMr>%W`x-}>YqpPan?+Sj^oXY3vQ)i%G+ruKT}>rn+?Mf6#pIlFLUX~?@P-|X|| zb9=s<-$6g|$$77y{&0@5{jlb*Y;W^|-|_vk53TyLWYpY_E0D>JZ^HEF4|9^cLvvsK z#PiHB->mhS`~2_f^=xED-Ag@uZX0!IUj5I{ZeHD@dhT@pxl!iVl0Lc7quYYSRjFr^ z=HJ+FIVSh|*O?)=f3veiVSW9+_ZLMs5C`NA8sCax};_Quq@^Y?aNEVqfz``7Usb5_p|i|al5 z__x2V`siKZgB78dKfHT&{SObUAARY$+syURv$uV6IpD-ocl)gNU*Ec~7(~8Z(<`^N z>HMXA!DnCiX3(z7@5rA&@vU+0+3$Od5=NKb*8KMKKW}U8KiV*Qr`Ja>oW66)u|f5R zD?T4MYGT;(VeLMA;>=06r2G>LeK|=oZhj zCsWPQPjioU4}|bf&aWY4FQ}F_&k^zqgik?ukDicbYr$29@FfTzftBx9|3S#(?u6t& zPe>+c@GB6$4dLP!2$||hi1Z@l1L0#3P6sv8^`Edd>`llk5IzQB={iD2_z*K`zaE4F zpZW<1%X|rGy@8OQAv_M@Mn6LCc!`jHp!-fixEaDpFB6guF7Db_2w4FB&2GESQU$_+Mx3>ikYVizd3hHhkG2QK zyP=d&lO6ZMtpL!nQTqt_Rv@IH8oYm~(c=At#6wM{9DstF;bg!;Lj0gA=N<+J9jdDN z5hw*zQS+k^LQTwji;&(>@`sNRG7#)%)p4}B(8edAWKir& z=^fy5wZgcVt5~F0t#|Z4I$>9P?D!UAmnx^$x~+`gp&O5At9Ae z67eHwZz#!AA43~M3I1^&gax(#Vl5$qp(Gz%fF^(f1lEC2&?j;}A>=X?B z2qk*#dqR?+B#VB4>V%TKca4zwP?A2C%Y*2XJ^}ZRXfx=Mx-NNF%GP%a+FJR8T$@NG zc|sWV@EYPt$uwU|3<2_UgXmD&R^AszhxxUo6f7VmI)Z8CcHuNbE(xb?g4#lh!9o3r z2doG{Az|XwR(>v=Ht%U41?9vjJ93;FI$}_6#^S0o3n-xzIg|>p?sjaUtr&~+j!sfQ z>p8K2mUP0PRT+zAz`|@Vw4_1aK?4hOz3Y3`BL%23LMy7wBb+IccEQXo$6zb-n4MBN3(cy4%Op8MYFgY&ONe|&% z$B`U#z7q!e-ws0+g2z6Jh1!ej<}h;iQR|-@Q#05=`=OdR4JdyzTw4F!SeL|hwqkh3 zaa0P9I9GsPq?%$a?FBJJ=u*|Rn))zasPweb=z#Kl5=i9tV`*n!I||v$NHZOvan8^N zBTaIk`q~+aiK9toJN8Opu;Xaq*m<;Y>_A#L*0&apb*$iKrG|MeVm)ak02e?L$EMVx z$DXByWAC!ZC-RKJhj57CIQBXF1RTeHr-ftRv%}@;c+l~Jd`|)$>st=7iO}~xfnId1 zvNnN6P|t&~@Vul8CBAZC5*??@9#qIBd7&Mbb9o^eoBx2R|21)!=NSfE4ZD0FKL481d~i+7y09Xe!=EWqWq z!&J?7fTByMYPN$^{W}EX8EH_ny-txM(x6*=n5utoC^SOlfn$g`n+Kr zlZRzHl^gvLN1;1uVCb9xUFCDx^t9;K#z;wRoQrv3ha1d60Fb=~&_3g> z)uLAV5xN2LLgy9D$r0-K=h;y8Z_<|(N-V{j)Zwpk;{bYzdc`MFvb6^#&-b*c2~-H^ zw8(jbX>ueMdW}sXu+Y^ltwLj=awU}c%3#_aQUwg5-5ng2|5pOoUVQdu>uflT;Qu}) zaD;ASy^Omzw!P7+1dh|~3Jvze6IA_sTU7$`sbO?BJt^l5rz7Y)@{_~q5D2~+PBS5h z8Nq^CJlKxGDfwp%-j#ceq~Y|mJc$Pn@?ZlGPGIn!{2d1G$}LAR%5FTkod@@0@Sgl4 z2Jgy8Ie3`|&Hl#Xk})_ckHg?C`92=3<-uVde8mI5(TpU1G@W=0>TKs|7&33kXL;h^ zFgR8jHiq`6?dIfB@QZ`dx=O zQ{e3la|;}~rWV#~uCA=tsIIEzA@gW&S}iY~2a>FjU!6x&lwMg*$Ft=I^gf#_-nNRN z=jn*yAO}odmM=6fIKXBe<#aS-feNxYvB%KTTUktCbZF@vF`RigVrcd;tEc8eS7|F> z;z9TOXm@2Aq-KmRlQl6H26d++h6@~y7}`@u4DG37LC~Hy(D^APM%xIWEShOrcW#ErO;}l}A-N;Tjm)O%(B+ zr7(l$rbewcG?f^2V=3+4vn6ZFYC4WJQ5PFdYH#Rjhw)m*`8l$N9niOe7Qo(<)CB#2r)j0W!0I(%O{GKL{tk2H3=J&P22&d< zO9RX1m^^hY3^x0&(NBZCzXmoy0~@G;4bs2{+hS&Aunn;V6>KPA>L^glGt3U-J!H5B zHc|r{rGc6MrU8!Dz{Y4`V>PgG8rXOZYy!hV<@V3h?zC;?_~+>~J@gZ7dF&?xn&>Cr zuBTT;pnp=KAK3)G=PR^>n}bW22O>bfl6!A;>IVfp3YZg8PI)y?(ZHr^V1*i3kp^}L z!<3Vj=G_c1t zu%#MUg&o$OnKbhP#ZXYD|at>#!|@SF4l?4lnlUGBjqx?HPcbT!gnROlaVg8sq@`gf$i zqR=mIf`0Wobc>tA!uxX?@~_pv{-J?AuYtXwfxT#psSEG_v;~#9<~j{*y#}^H1A9pW z+o*w=U)BI$(ZF717}vULH`}B^w^;*w%?2x{&#|$wg=4(ms^C@)LY$(iE|5yMT?4Ds zz;-Z9b@6z{Rd#e{4(_xAIkrm!+pU4^(ZKfFU}|mcbHMI{O`U5hkDsM)p_k~Zc$FKP z=(YRL)A?xqA5iFDYl41i9nExi=;iwzBtcK}fChF@13P4csm<}a26osMGb@e$hApUI zM>McEHL#-^*jpOdF%7KsaSiYU$0`qAqPt#A$Pq)f@y3mN=t?Xw% zunY%(9v)BNYMaNWWR@K915J=GeNRnthjhWX@<;lwbo|9=I_Rbh_+-K-3qCpUIR&3S z@aYSme()IpAJkz3;e+ORFnn%<&rrGNPc&9P0Zs?Wcm6~x|8S8Z*XA15Fo{VX-AYJt zn2JN)*f>snz9lkDb;LNPW0*SPzGah6y&ZPVW=%nzx87iwyKNr*DNpQS3o4kW2Ii%K zd2>u29V!fID9`OIuK8w@|tmT<@W zV=&pupPZg5w3dga3O@g}UzMG^2oZV*jo1OI$7*D_OBberg==6PHLy+$Q@aS~*V&fN z4C{5Mb`7?mf<YpcGwsjtXvT$Rs%C?U~w8)yatBrJW$iB z-RHHCs6m*-F#9S@wxct%8cfl^QZ=wNJ1mK7mu_|-7pA)ghHF6n-Abfc`9X`BynURk+iG`pCykLWI0}f#9XX`**UKE==>D z+(#hUV+Arf-$}=_<>QY#bix(-T)0C8W0&30VoS(=)@#)6)pFZ>Asm)n(_x|aPgpBf zmdn+}L^sIVI>F{k(28D{kLL>p$oN{m&>eQ*#1#nEg-cH8#}mtA3xvrHYnpu8g!&a1 zB;SEl4pO(&$TC<13sG2fnBtUis1nt03X||opcta+Xf7JIgKfFgTY4YTc%~^)Sy1vJ zb@?a5;_ye6o2ClKJR(1&sY;?2jVG#np+tz*0e!kc->wPzUrL2e6zaIcT~5`6655sk zwGXN@M-0^&*7TjuEKpfFlB2S6#86owi~Yc&p&fZWqJF}tFYgkDICLF*4Z_J44I<~= z?ZipZ8I=#;Ex@$$Lpn&QB102ZwB#N^k5xKYp*J=`Uv-~wMy%8=5{wj_0eprBg-sZ+ z!#OZY7(?XT7llyN80^4U^&CUIRu8;iqaG`i6Q96%dBFohTeBL0#OgVQYGMrW29SEF z41{v@D(mYdg|-$#f!5dK%nT0}319q*|Jnj=Q(L$PjbWGap9F{wRO#x!08oTv@;xsI zZF<(g6)F+z+j#JAD_hLw3Vbm67$wAWhRYKl6xu>sdESFU7>3V2D4dLr5i(5pFqG+} zfXpPtkTe$(uGC?2LL`zX@c3dfndDVI^^h=;wxcbf<^T-7D6BMirFt> zyF^HAT7<`hwJTo~y=1S)g*)`O0kiY++{cA`^)uM%4LJ3lkEgr|ptJg-F8Tt4xz(8abO6}ME7$xRhx+07KhVqcfHBEpZ*joU&Y8>!2`-;4;duy%Qk zkw0N4u||E=PED34_I2!9`z`xxdh>YQ2T@T7<75uQlMucGpHuL8SHa$c@QiY9nec%z z5ef108GxU|2Rr?j@c9Zpm*9hO-#~a7KHn7lYl2Cc?!$P;;+g8A(sfv2) zW-96#;f2aQtA$Kq`%Yme_-pDg*$(y$hsi)?nCyY;f}@q~*TP_ekvL)~6aiEMB_jeF z&RXy@h;1RS`G?TboK7-G7TmPTBFQ9;7)dnAgx~b0kaRdpB-s!f4`-=xo(fmdK$A%l zAT|zCU}yw98P4XDdr1yZB*1khP$dJ8Xh@sI_#v-EK$01UY)G97XGW5p1t)QkFar|C z!+92bCjm2lps?j3LH^|c`u&pTLnq1uJU{ln)Qgf}erPz3)Y#r4qA30eu4hCgh6D z%4(S5(^kFdsr zl_gh=!#=2UkPvHH6$%nO}No^i1zIu*fEhrteN^p{(9*%7&_j*+b z@lZ|t|JLaG4{I@#U5iCno6=Q_`2;>F1o$;RidOkpTi_nG`XO{|0kxHIUX5fsAl<)X z6rI%UgQi9Q{TlBPq1M0gwkm|BLA4zox`nn{4C($IZFTDZY+EfCsskI>Y^ed(wi<5R zRxsVbL-i!MF3VkX+ODotU7Wk^%-Ee%1y3ImFFsud25u_}E2)S{Jyz z(XbZ4)+4YQ8T-i;i-NZa zFY!>L_!T^>Kw0rbe3%MCxZ?kt5^Lk%*p#b;a=5*$wikx=jW^|WrR9-w#Q!%XRs$Z^ z!Ds8&&#;a7t4HON>=uAYZ4;DAJ;$&{X=lXmu!;EpG03Xv-!=yEuEHu@fP^-|wyA(~ zAsBqbTsXl4K|JtWex*tXxdX3`AQ@0$QaljDgI`(i%pev4^SqWofh&*dkqW98=JV0r@lirl6+V< z-v}99V=F58kj-rjvEqF}1}(fokve2H^$<>#II5QT6$Khrt zr15}KGFk{XLY#pN7pmZHRQ{xRB9Z=r9-by7P>BqN2drWIMz}?^9K!4HK@_o$q?aH- z%Arb)NpL2?LO7QWO%$|McbjTX(&Ot!4 zT@~6(m~nGes0fJEt^~{l!BD_4P6C>-3PHlTE+uS4z^q#m5UHI6%vajDTB*Vv5IVLo zO1=hg323oBt(^!vXI}y1%Kq_aibEM zB4n5f;R=sBx%@j}2n@TE-wDBabp&7YAW7LX^QC@MoXgA_rC@gcB;b384Hq1Uqq7D$ zpxB548J=mSt&{tH&jxuR1PM4wh73>79GESU=?>hoGH_Viq97|goaqN)H}$*dx{W2W^A11}nZ;_nP7e4{ z7!-U*1Hh9^cS?eYnq=LNLZ<}eQ7Y8IjUzoNnweiv#`F;u5^>BOy8{ZZUe~SsiIrOV zNoXsM1A$C-fuDkwFFqj6dt@{fXY?{P9Azg=wpUHi;9e? zS~vwQkSk({T@hOr$E`PX7)sJj_dto6cEIF7quLOpU#Z)nnNEOo_bKU&N;+;7F%>-S zZlx}O*=)xQMM!wRlJL5oXQ*miOu155sF_X&=^j+lRV(RqB!5=^Y)pmes%_GBx0VnS zKB6RC3<+22Lf{)~0(X5pj*ZO@Rs+abKKZlI%3PulO-Hpxttx}7Tl-R_o0cnT4M!iR z7YV8o)xtT_uTbbwS=WNxn0XC^Sp5Oy&7Zf(g}(@a<|DTx#Hw2q;z=7JhAKkzg>a=# zf))j#%pg^&B9)Hp*m~wLt0^ETV+35^JPZ0}4XZ|pJPW0N9y%9dYgw3KdeN?mzku$9 zrS!y7zR5f2O5I7uuZrl%s1ex`>NKoH^G0}1Q%AB6VhaaIdEh z@2itN>o$M$?zekC;dprie&(m$|FYt%8u0heZ98PeHz~M|Z2sopFO0pJWpIQ=G=~h{ zKePSB`)iLL=NZ&89G|9z_`7RQ96I>R7Nv$zuW!P5nR16>CNH< zXa>~|TlF1kc2tMxpknRfw-c=yhK=wN$@n!t(FjV+Pyz!v0Fu=~<+LT>4@x~H{O&A;MMr04$nENdKyY7-^}=X3q!~$8 z`oQd_ZI&1=&rB0LFmR9!cp^;<(qH!nj(<0av9#{*C1P**-o(DIh?T%>9Tig`sHI{t z1VaU}pNQpsS`d5c4+w#zO8!_7!_De=z}mnH1{&B0EM*SQP9K>qjZDt~$3|k~g(ZSw zMnKVQM-rw~8wL#uZab8qxV%>su!hTr!GFXD@!hOKRX+)|mmYOxDx`0vN`#W*PYZY#s0O!YQxNnF<}5064CIX6TwAh^ z#&LrG%E!{)2^K@Cyiw8KW2&r8|uxcfd(bD zpqZMdG_aIgK}ehxI#ypF?sD^?Zkyn6Ljtv1a7IU-y9Qx*#5R7dq5d#+qMJA@g{Sr=Hi=n>!PM3s>701C zo0z2E%Ch*;4SM{o@xl810yN|wY)GYMp&iY)(2%I0aY$n3YR~6QbX zK2KkTPjwtTWTZ5B)IjqA6+g_)8|M!XRvQf)tG*^mW>S=l-1qXv$&4qMl}RN@X0= zFFN7c^=2U3S)b#Ye7n$*9EHA!7G&rEZb8t1pbmG3S(9Av4cZ|L3&G8WwYzU*LnDgS z@up&)fB0GQ7`RP#x;y7;Dg2BCg=|8vNYBa$W$-5ekcHz zCQ`DkB5RgBUI+2rB`b>M)sfLe{te12AMz42Y2C^!W>QMB#6D2@)!xj`T**Q^Bum+1 zKQs5N(CNY^#zx%;-_~qVC7_pJZ7JJxN8b!bV2Q{zTOowj8sN4DCo4k%N4FQ37gm~e zYnV%ebztk}q5G2x8${~Bz&Sd2LmO~=2d}UJw|DT$72L+bWA4=|z@ZvSe8pDgYr0L0 z%3JZmtX|s@hI;{y-k#NKt7SNPbLi!v*T$W;>wsU=1+ZOQSc(WZW6qosj#0uA2rOEPGco;L{!?*qb{c>+Ho4ISQZQ2Ow((tzx- z+6j5Jfdj*jdGibrni=r+c3r*b!Ezy>UpQ8;eWXM6+C{poUNr8=IkCAoI!hl9FwY54BVF1}2$Oo-87YH~_ap580z)uof)J&mDek4e2?On}0gvG$BVaA~@ncWnWrHmEr-+>8ddd3BMdkj;S3w&hus#rb|fbR5mLY{05dTd_-tx}fW4+RMC~;= z?9~jUh~LMa!Yi4r-3U8TIq=7@OvwjkoK|05b=8qzOoJe<1{(_chkaZ#b8@-GJO=HF zPNO%JoE@O>(A&55A)5An*T6ko-5znt!lvNt5hl>?x0 zHfxHmhN8#XmE4&VRALtp8Vr>xuOZUVU2-JEnnv4}7%FzPk(XO-n+8=R21K*IvEjjp zqRg(cXjEp#)!eY&s`eR)IcnBBjjDsL&K7Ki*$5APP*-eS;W!R$S8~~yZGk-w(SEpw zYc#l{uhz+Qf_HLM+|oy|J)7z26X%ws5oD|L&(0mro$HGf>X&Zp?AORy%RHStJo z!0jg^9u8yv0Q9jEk;Fw6AbG-f|uOo@~{~cCNI;i zt`BpKq6a@8@AugDNp3WFd{gs?_I#n;IXU)9)C^Cz6MNdIxP}RV{B=7qCC%!np(er7 z`;bWmQ;TLwd8NfOiY9CG1v+^`d$ChXYjUgZYft1mx{2-OfH9(bs67GpC7w%vB5#~5 z#>pRc6I*%WxMQxR+(i=GdN%l-@=!@^9casfC6?z&Vt9xxY~>q9J2;8NjqSlw(2aZi*sD`ft|$2 zw5E-t>U$!yzKj_*O(ztrliALHbzuZmzk|81zE){$T~~wRT5)ljbYTgFU%12Kn7lkl zY_7Pn<-oeZl~uPkVf{44&FaYhNo%dRc&_aa@Cl6lqB;KP0UP92T-e6fTFs*dstz2l z&&FKQ#@1S4-ZQ%2$i5BUr=elq(-=p1Rg0r{3*8)&Vo$8*cBZPGnTWW5*Kuw zwFXzF+$&brZgW^Aq%y{;qG;OYsopC1Kun-2xkqO)iQOQ<``6r`V)~p!%FnhFJISUj zQ7>=mEb8N}YR;WZ%t{}bZgBQHZT&&e&w*3L&f~4BjmIiEgFOR}^CtX7S3d4WxSi&5 zW!To9*q%4IUd)F=eU5#}1WUUZrm|ZjYIR!uF$r+=$3h^igEY$40JaGaR)$T?ebI8z zY9L0-LA%m`+dF6;sOQ*9vWDvpN0m?lnypdyW3Nm1-x%FrmhoiA7L;A9lLtv|Fo zyWLV9&F;Y%W7s_yQxE0t{-Zr$lA7%_-a>Niu6R(S(^`asF^&hQAQvjq z+_2+M^*EUS!!kyf1tyhv+~UppGM1hTqC~b>@;@jFO)iM8f-(|ku1FQCCJQsB>2I=iQ z6=qpCF+Qqg-AIN}Ak+4v(T;Lw3frJe5da;dM(;AqpCpJwf=;sfMIXxQ&-}i7%eJjy zd+x%6=%#oO5IU+tyq7Ei&O8VRVdE)GwQN>&%*vKQT+&$wQCc2DbpvkiG1N5R_8!9( z1$XoqJaB&(?BNR_m1p){tUR;%n?38~SCd6AcknVWPF?LuWrWU7!%&7hI}L>lcXk@e z0l%hO#lAPO?<4TdkN;SwVeFslG@N2uAICJ`8(5@z!n^|baQRF22L7kJ1f~QWFMpy- za3vlY{(hHW6HBk{67czzYWUk~t1rG~&+bNCU*OrWdZBJ5=UT$G)&CFL`d0?enEXHC zK~$NE^W8Zuk7BV=?M1h?C5<})Xu+&^|I`%>^elXhz!=S11ccy7uzj|&$t32*Vz+|Z zjV_HMC1b(g#0fkeRq{!b*eV4RHFfiguSnrDAW?#lSj<>Thdbh!7#3+<=7?sP_fpuq z+bER| zcGps&XN3jE0}BnyvcUR3)5A)QM%n(jhjk?i`Cz^9eSA0VVeMcE@y=XR9@g`jVs`K; z*mZ}^)t$NFsv&FA$4b)Lzh~=L*`7D}Sn{*kVrz{XWQAS0JCzIJN?k2;D74mJ#=wu; zaCyXo9KLdN_sNqxU+2psB@OtV3rDY8@x_3n7q&(TcVK7+;G_b4p@dL)Mi`=mMkVa4 zgt4tr3O0jg6-=I-f%uJKfFS60c@ zIbyJmf&l^F2m;v#t9gwj>N?fFHp4j6uwcIGd91-+zqt&t4wZw zUFjSHd#y837C_9Ou%4^_BEx!%?Hn-rgbfD_v3GMC>n|-7wBeT)Rx0gZT2w(la@v-M zH|7kahLuo)5HsRi@)|FNeSha1P*)Wiu*xwlOlDnbT?$Y6-) zvS1rYuyw;Ps(q9ak19E!KkQR$JT=#3xS&uaSM(R#H@a2u9B`J%IdI`m_ZP!$ZWm$% zX6P|M>@=}vT)R?9TBy`!+9q{q18#3p3jxP; zk!J8)TqLMffa^*a0FT~5JVFUgN;n2WEt6WpaA%Xc81Tln8^Hd&Hbjyq zwijDBw^w3SPj0ne{8{nL$K|+m0_GugiRL$uaCSZd()wZT)#jY_O#S;8g=2Y97(ki)p zxH#+<%<0d=#n#Fu{Lm3%`>xiz$2!=EAL*dRuzT^ESM6&H)yq|*sz^AI+h@TqSZng( zCn!+gR+jerZhnvPRU7?g&97))c#hm&EtQC{cU1%hZ$UBtzTR_ zTVODMY;y;c83k>PUeZ%&-0M zM#E`~*q)>Dx0+P!BD~DGt#~*FLNv%jA!I*4gK(t|A3>;XkV9I)6hLc|YlPjS9JjZ~ zeE~y)rs32T(_iV}JR@$`}srVfM?EsH#q;m#Jh5OBvy?!Rx2Tg`TE zV~e;n%Jy?yd}NtKT+eY!ApXxa%Kz8qxI^LPQ#WIj@$n?M;(1eZ+>YcsFw#{(&fV@m z!#J;lo(g=-pz+vb_v0Oh8lUTyu>^m%adxr!_J3op`)Iz)xvsJ&1m=h{it~%6@TK0H zo9*((zgc4owiXPIbu$M4Z7aOl1l7pzp8bY^M*Xjv{o+iD3;Y+&emx)qw7&4H8YQEq ztnYvO?AJ6=nf=zlx-J@9T<2Y>!>2-O8{6v;qh)IYK%;5d+6chW)|!-Xj1rb8;o_Fc z?01a<>`=m!O8A8m5-=*rC*_AkQ7plqZD_TB zHwEv5BCRI$t!HT}^$#77w~rTWoFfo3_V&!65rP8)T+4fA?&-knKtTFPaVS zfCp&&rL*BNkOB5}e2xgus408=pD-Iv)tC)aVrqImEMJ}~wi03LD|;1+ZRi!*P$7=+wm2Y0jN#0~yEal`) zpIzYdNaie4L0)Ozr0GHJhnCMO$S;^|o}NeCvijwd(<5ii@y*E2Eh{OWT|oT;jU!3H zjFRbjr3G051+$9oTG=df&TI*P%y!R`tgIq3LmD}DX!gV`5H}*uXpEA|<0GZ?+0qEI zJz(ZkU#|!K;R&xE@QByYz(FHM4D%ZJRKVC(0VDcmXOofr24`iDnK+WbgVM~|BSxkV z7e+3~?l-fvU}^!GB^hu-@@DeQ_I0N|-FE0Ofjir$w!E=^r^oBQUYW$O(0X?F*yRmgG$FULAH`A9jJP4tq|wJZ$dju=3*i)nOOq z)nTj6VHIHo5Wl~Txd7rj=pPCDV!Bk+X{l5{V0_elrt=p(3Q8{!{kl(I73;|BFO8Tp zNy;oHGbR;h6qm(MEYB>=n>n>0V$Gs9zFv9mYsCF}!;bx8jWoC3PahcA?>t>Ib5`-)%i4)E=gjCveZ5u} zrY|e(DJ4sWx~W^qyW7qtpW3o-!_!B1=lNJXNJn3RMap|V1cNL6=dxX;_ z6&Fv7AtMS43QA|kWEzX-%q$fKCpC|YsZP(&?^jx|$+Nv!UOGFXC^BZIsbWr?XviI5 zmgec}$SHlyzC+8~2p0D{b>GqV+8c7)UAX2`Bt=UX#v5sR>-PJ{KG3nm{Y=}HUSTr| zLf|>b&xP%yVWYEh2CSx6eZz)lE}(`ddW&JhR?~#Qu)fRbuVXwCMtfwAe$(v;EqT0x zmiu}c@M*;h3?_V7v9H(b?r{|{BTCJ4*FHIA#&SZkW)+uY72iEGU|`Yg(mc$$ zGku6AJVp(|mV%14`BH=>qN@})%p-Gm-*->fy!VW+SJ&P>6QzV%q0;wj>6*80m`^4im#%s3RP0%QIG;FZ?F>X>^~JsJ?(pUl{@4A}-@djui*FLzG!3QCAot_H;De@pJ77lTS#7+VY@ zwaMXh>G$!&NEp3hgxijJsW%dcWSI2L(89Na-z!+}{%eUP?m_o^%4^5WdZ}x>_@Q(T(@FZ?alKL)-6yzBQx(M(P9jTgmxy`KSOln%b&8TwX_GIKT`wk5Gaa_IoWfQFe7Cc4Lw})y z;)59bdXnm}7H;rVFoEQ+6FqdWG}PvA8R=j!iti|xT&gFb>j*q_*~?Av>M3~r&0Uy9 zTX?uN^Awu>YU;P-HcEVi{yjVeua<l)W4tl3Cczj@JaoED;wAV|+RSK7Or9SePhyPW#_-H;6Ub=L8O3+co((R<9xo}9?(n!09qB3P zh#S5Yx>c|rM8cCT;5LT(x`bZGITEC-uMdNi_4OSgWqo~TcxZloeIz7u zgV1`!0vhz0R6rPC*clOgbw z(DXT_#nm(Na5Evi-j=2>%pNjjO3~y+*+a6(lyZ24{N($ypY<&dTv1LJWXEUaz#DIk ziJ8$!895|9I?foE5uMRDD?6z?J3YNTGtswPAHO)eeAU!hc{7NVQ#8F`_JmBSc*cz4 znL4xEAmBEucy{rWQVEnK?7qsMFofjf^vleSOP)XmjTjP>HE>|K_)x&YK~h|Dj8W1J znY3WPG_YvWtdP7}bIAZgTM~C#E({uxQ#@!^VkGhc&B!`lJ<6&Y?2_B>%?4R zR$@|oc6oMObha@yhZ;T7qf?1l7j2AB23ICCG0T{dAtZW^05@RB=n;!1%+`;{85D0E zXm~86tyDenSm#*SeHV6LTs6tMQdE)qE6J`|`m%2?jSWzwy&(6utit0D={?zh7>A65D zv$}X@>8#@E6O&CzeeQ2IF1f6Yku1w?Gn;3$QoxpfiV%`|-#p{7YrY%ezwwR#(igw$ zeb-Nlxpd-(*2&-aCV%PsBnI`q7k$5*b;;MyQ|gvCChwuRKBU<{_S5q2(6&>y#Swqs zqq_Lhy4a{`M+u3H?)GxK@PG(Y7)+>NDj2k~b<%wQq`Cg^?UiKqC+3duX7XqCbNvHe zbBFgrN68B+#opn^^0u)T-s?Qz$FQIv*NGz2-1tRd;0v&CB7BFqK;E=N+(<*^+p6Fk z$NTo3q964vB?T}X;0@Js@GkHkBjoYBIBhSv^KS97|7b~tM>`p=pqE1mMAP9f8)y?@={T8W z$`^LR<0r4|5q;#oTf{^;aj*EeaGl79_KM{W$|;pACrVm^N(=!-6$)V+_;4+VuZrO> zjQN!*c&pY!E!#N|-&_HTlj%bNDu}QjDdzu1mm zmv`&I@(j7g-MEu~)u>-#|tiJ_^3L z=-Zso_TrTTVj~}<56)WTvWnEJ3$CtAWuIo z?xJ($h!bM05H(dEdqRxC@Zl5U?U?Ax6XJMEkU%t)b`<)ac zMHtocoRg4n1d(6BFmyrXdnd(9!phTPDLpOEIW3y??}Jzd`NnDSUiyhV=RMKv^C=(? zGI1fJ>UTxc$}{5EL*laHa*SzlamKWS6l0d{C(PF?YiLH#u!Nk1toV$Sgyfuzlr&>T zD*r%ipUj?N$#KaEDM=~G{4X`FGVXox0a{sIBN_#|Nxphk49}Sk8N<^h$Rhaoz^4K} zpe5NYNxU5oZXR|j(0+u#rX1!e=Fh#Gor7W|%#0Sxw|^)mdyONWL(h4v_!0LS9Z#d=>JLTJ_K(GCk^Z(hZ#7+3k}FqV M5KWa8x6x|)KQi95CIA2c diff --git a/mes/qd/src/api/wms/mps/produceshiftorder.js b/mes/qd/src/api/wms/mps/produceshiftorder.js index fc7e636a..76f7d6cf 100644 --- a/mes/qd/src/api/wms/mps/produceshiftorder.js +++ b/mes/qd/src/api/wms/mps/produceshiftorder.js @@ -8,6 +8,14 @@ export function add(data) { }) } +export function addRows(data) { + return request({ + url: 'api/produceshiftorder/addRows', + method: 'post', + data + }) +} + export function del(ids) { return request({ url: 'api/produceshiftorder/', @@ -96,4 +104,4 @@ export function getDtl(data) { }) } -export default { add, edit, del, submits, getDevice, getTable, openStart, saveReport, finish, getReportWork, forceFinish, getDtl } +export default { add, addRows, edit, del, submits, getDevice, getTable, openStart, saveReport, finish, getReportWork, forceFinish, getDtl } diff --git a/mes/qd/src/views/wms/mps/produce/AddDialog.vue b/mes/qd/src/views/wms/mps/produce/AddDialog.vue new file mode 100644 index 00000000..22f0f465 --- /dev/null +++ b/mes/qd/src/views/wms/mps/produce/AddDialog.vue @@ -0,0 +1,287 @@ + + + + diff --git a/mes/qd/src/views/wms/mps/produce/index.vue b/mes/qd/src/views/wms/mps/produce/index.vue index 1a436dc5..39a5445f 100644 --- a/mes/qd/src/views/wms/mps/produce/index.vue +++ b/mes/qd/src/views/wms/mps/produce/index.vue @@ -118,11 +118,21 @@ class="filter-item" /> - + + + 批量新增 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -428,14 +301,14 @@ style="width: 100%;" @selection-change="crud.selectionChangeHandler" > - - + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + + + diff --git a/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_foldingDisc_smart.vue b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_foldingDisc_smart.vue new file mode 100644 index 00000000..884c08fe --- /dev/null +++ b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_foldingDisc_smart.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_threestation_smart.vue b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_threestation_smart.vue new file mode 100644 index 00000000..41d2800d --- /dev/null +++ b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_threestation_smart.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/wcs/qd/src/views/acs/device/protocol/index.vue b/wcs/qd/src/views/acs/device/protocol/index.vue index b6e1ad0e..11f035cc 100644 --- a/wcs/qd/src/views/acs/device/protocol/index.vue +++ b/wcs/qd/src/views/acs/device/protocol/index.vue @@ -58,6 +58,17 @@ > 导出CSV + + 导出SMARTCSV + { + downloadFile(result, crud.title + '数据', 'csv') + this.downLoadcsvLoadingSmart = false + }).catch(() => { + this.downLoadcsvLoadingSmart = false + }) + }, // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { return true From e02a6c8cfff6b034bdb7816cbf9538fd80d0cca4 Mon Sep 17 00:00:00 2001 From: loujf Date: Wed, 3 Aug 2022 10:23:38 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HailiangFoldingDiscSmartDevice.java | 3 +- .../acs/common/HailiangPaintLineDevice.java | 60 +++ .../HailiangThreestationSmartDevice.java | 4 + .../device/device_driver/DriverTypeEnum.java | 4 +- .../HailiangFoldingDiscSmartDefination.java | 1 + .../HailiangFoldingDiscSmartDeviceDriver.java | 15 +- .../ItemProtocol.java | 12 +- .../HailiangPaintLineDefination.java | 74 +++ .../HailiangPaintLineDeviceDriver.java | 257 +++++++++ .../hailiang_paint_line/ItemProtocol.java | 113 ++++ .../HailiangThreestationSmartDefination.java | 4 +- ...HailiangThreestationSmartDeviceDriver.java | 18 +- .../ItemProtocol.java | 14 +- .../service/impl/StageActorServiceImpl.java | 70 --- wcs/qd/src/views/acs/device/config.vue | 4 +- .../hailiang_one/hailiang_paint_line.vue | 487 ++++++++++++++++++ 16 files changed, 1054 insertions(+), 86 deletions(-) create mode 100644 wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangPaintLineDevice.java create mode 100644 wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDefination.java create mode 100644 wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java create mode 100644 wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/ItemProtocol.java create mode 100644 wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_paint_line.vue diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangFoldingDiscSmartDevice.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangFoldingDiscSmartDevice.java index ff1383f4..3eb4c3cf 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangFoldingDiscSmartDevice.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangFoldingDiscSmartDevice.java @@ -21,8 +21,6 @@ public class HailiangFoldingDiscSmartDevice extends AbstractDriverService { mode = "脱机"; } else if (hailiangFoldingDiscSmartDeviceDriver.getMode() == 2) { mode = "待机"; - } else if (hailiangFoldingDiscSmartDeviceDriver.getMode() == 3) { - mode = "运行中"; } if (hailiangFoldingDiscSmartDeviceDriver.getMove() == 0) { move = "无货"; @@ -32,6 +30,7 @@ public class HailiangFoldingDiscSmartDevice extends AbstractDriverService { jo.put("mode", mode); jo.put("move", move); jo.put("number", hailiangFoldingDiscSmartDeviceDriver.getNumber()); + jo.put("container_type", hailiangFoldingDiscSmartDeviceDriver.getContainer_type()); jo.put("hasGoods", hailiangFoldingDiscSmartDeviceDriver.getHasGoods()); jo.put("isOnline", hailiangFoldingDiscSmartDeviceDriver.getIsonline()); jo.put("error", hailiangFoldingDiscSmartDeviceDriver.getError()); diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangPaintLineDevice.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangPaintLineDevice.java new file mode 100644 index 00000000..300e5165 --- /dev/null +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangPaintLineDevice.java @@ -0,0 +1,60 @@ +package org.nl.acs.common; + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_paint_line.HailiangPaintLineDeviceDriver; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_threeStation_smart.HailiangThreestationSmartDeviceDriver; +import org.nl.acs.opc.Device; +import org.springframework.stereotype.Service; + +@Service("hailiang_paint_line") +public class HailiangPaintLineDevice extends AbstractDriverService { + + @Override + public JSONObject getDeviceInfo(Device device) { + HailiangPaintLineDeviceDriver hailiangPaintLineDeviceDriver = (HailiangPaintLineDeviceDriver) device.getDeviceDriver(); + JSONObject jo = super.getCommonDeviceInfo(hailiangPaintLineDeviceDriver); + + String mode = ""; + String move = ""; + String action = ""; + if (hailiangPaintLineDeviceDriver.getMode() == 0) { + mode = "脱机"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 2) { + mode = "待机"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 3) { + mode = "运行中"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 5) { + mode = "下料位申请空盘"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 6) { + mode = "下料位满拖申请"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 7) { + mode = "上料位满拖申请"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 8) { + mode = "上料位空托入库"; + } else if (hailiangPaintLineDeviceDriver.getMode() == 9) { + mode = "强制满垛入库请求"; + } + if (hailiangPaintLineDeviceDriver.getMove() == 0) { + move = "无货"; + } else if (hailiangPaintLineDeviceDriver.getMove() == 1) { + move = "有货"; + } + if (hailiangPaintLineDeviceDriver.getAction() == 1) { + action = "允许取货"; + } else if (hailiangPaintLineDeviceDriver.getAction() == 2) { + action = "允许放货"; + } else if (hailiangPaintLineDeviceDriver.getAction() == 3) { + action = "允许取放"; + } + jo.put("mode", mode); + jo.put("move", move); + jo.put("action", action); + jo.put("number", hailiangPaintLineDeviceDriver.getNumber()); + jo.put("hasGoods", hailiangPaintLineDeviceDriver.getHasGoods()); + jo.put("isOnline", hailiangPaintLineDeviceDriver.getIsonline()); + jo.put("error", hailiangPaintLineDeviceDriver.getError()); + jo.put("isError", hailiangPaintLineDeviceDriver.getIserror()); + jo.put("message", hailiangPaintLineDeviceDriver.getMessage()); + return jo; + } +} diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangThreestationSmartDevice.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangThreestationSmartDevice.java index 884b896d..5625b811 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangThreestationSmartDevice.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/common/HailiangThreestationSmartDevice.java @@ -23,6 +23,8 @@ public class HailiangThreestationSmartDevice extends AbstractDriverService { mode = "待机"; } else if (threestationSmartDeviceDriver.getMode() == 3) { mode = "运行中"; + } else if (threestationSmartDeviceDriver.getMode() == 4) { + mode = "申请空盘"; } if (threestationSmartDeviceDriver.getMove() == 0) { move = "无货"; @@ -41,6 +43,8 @@ public class HailiangThreestationSmartDevice extends AbstractDriverService { jo.put("mode", mode); jo.put("move", move); jo.put("action", action); + jo.put("number", threestationSmartDeviceDriver.getNumber()); + jo.put("container_type", threestationSmartDeviceDriver.getContainer_type()); jo.put("hasGoods", threestationSmartDeviceDriver.getHasGoods()); jo.put("isOnline", threestationSmartDeviceDriver.getIsonline()); jo.put("error", threestationSmartDeviceDriver.getError()); diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java index 330e7d61..5cbae371 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java @@ -69,7 +69,9 @@ public enum DriverTypeEnum { HAILIANG_FOLDINGDISC_SMART(30, "hailiang_foldingDisc_smart", "海亮-叠盘位Smart200", "conveyor"), - HAILIANG_ELEVATOR_WIRING(31, "hailiang_elevator_wiring", "海亮-货梯对接线", "conveyor"); + HAILIANG_ELEVATOR_WIRING(31, "hailiang_elevator_wiring", "海亮-货梯对接线", "conveyor"), + + HAILIANG_PAINT_LINE(32, "hailiang_paint_line", "海亮-油漆线", "conveyor"); //驱动索引 private int index; diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDefination.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDefination.java index 688a669d..53ecc5c8 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDefination.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDefination.java @@ -60,6 +60,7 @@ public class HailiangFoldingDiscSmartDefination implements OpcDeviceDriverDefina list.add(new ItemDto(ItemProtocol.item_mode, "工作状态", "VW2", Boolean.valueOf(true))); list.add(new ItemDto(ItemProtocol.item_move, "光电信号", "VW4")); list.add(new ItemDto(ItemProtocol.item_number, "数量", "VW6")); + list.add(new ItemDto(ItemProtocol.item_container_type, "托盘类型", "VW8")); list.add(new ItemDto(ItemProtocol.item_error, "报警信号", "VW10")); list.add(new ItemDto(ItemProtocol.item_task, "任务号", "VD12")); return list; diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java index 7ee22c14..e85a3368 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java @@ -42,10 +42,7 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); - String container; - String container_type_desc; - String last_container_type_desc; - String last_container; + //放货准备锁 String putReadyLock = null; //有货标记 @@ -56,11 +53,13 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive int move = 0; int task = 0; int number = 0; + int container_type = 0; int last_mode = 0; int last_error = 0; int last_move = 0; int last_task = 0; int last_number = 0; + int last_container_type = 0; Boolean isonline = true; int hasGoods = 0; String message = null; @@ -125,6 +124,7 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive move = this.itemProtocol.getMove(); task = this.itemProtocol.getTask(); hasGoods = this.itemProtocol.getMove(); + container_type = this.itemProtocol.getContainer_type(); if (mode != last_mode) { this.setRequireSucess(false); @@ -140,9 +140,13 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } if (number != last_number) { - logServer.deviceLog(this.device_code,"action" ,String.valueOf(number)); + logServer.deviceLog(this.device_code,"number" ,String.valueOf(number)); logServer.deviceLogToacs(this.device_code,"","","信号number:" + last_number + "->" + number); } + if (container_type != last_container_type) { + logServer.deviceLog(this.device_code,"container_type" ,String.valueOf(container_type)); + logServer.deviceLogToacs(this.device_code,"","","信号container_type:" + last_container_type + "->" + container_type); + } } catch (Exception var17) { return; @@ -195,6 +199,7 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive last_move = move; last_task = task; last_number = number; + last_container_type = container_type; } diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/ItemProtocol.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/ItemProtocol.java index d03c2c87..64dd0920 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/ItemProtocol.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/ItemProtocol.java @@ -15,6 +15,7 @@ public class ItemProtocol { public static String item_mode = "mode"; public static String item_move = "move"; public static String item_number = "number"; + public static String item_container_type = "container_type"; public static String item_error = "error"; public static String item_task = "task"; public static String item_to_command = "to_command"; @@ -44,6 +45,10 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_number); } + public int getContainer_type() { + return this.getOpcIntegerValue(item_container_type); + } + public int getError() { return this.getOpcIntegerValue(item_error); } @@ -90,6 +95,7 @@ public class ItemProtocol { list.add(new ItemDto(item_mode, "工作状态", "VW2", Boolean.valueOf(true))); list.add(new ItemDto(item_move, "光电信号", "VW4")); list.add(new ItemDto(item_number, "数量", "VW6")); + list.add(new ItemDto(item_container_type, "托盘类型", "VW8")); list.add(new ItemDto(item_error, "报警信号", "VW10")); list.add(new ItemDto(item_task, "任务号", "VD12")); return list; @@ -97,9 +103,9 @@ public class ItemProtocol { public static List getWriteableItemDtos() { ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_command, "作业命令", "VW102", Boolean.valueOf(true))); - list.add(new ItemDto(item_to_target, "目标站", "VW104")); - list.add(new ItemDto(item_to_task, "任务号", "VD108")); + list.add(new ItemDto(item_to_command, "作业命令", "VW52", Boolean.valueOf(true))); + list.add(new ItemDto(item_to_target, "目标站", "VW54")); + list.add(new ItemDto(item_to_task, "任务号", "VD58")); return list; } diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDefination.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDefination.java new file mode 100644 index 00000000..3be39726 --- /dev/null +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDefination.java @@ -0,0 +1,74 @@ +package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_paint_line; + +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.defination.OpcDeviceDriverDefination; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceType; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 海亮-油漆线 + */ +@Service +public class HailiangPaintLineDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "hailiang_paint_line"; + } + + @Override + public String getDriverName() { + return "海亮-油漆线"; + } + + @Override + public String getDriverDescription() { + return "海亮-油漆线"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new HailiangPaintLineDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return HailiangPaintLineDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.conveyor); + return types; + } + + @Override + public List getReadableItemDtos() { + return getReadableItemDtos2(); + } + + public static List getReadableItemDtos2() { + List list = new ArrayList(); + list.add(new ItemDto(ItemProtocol.item_heartbeat, "心跳", "DB600.B0")); + list.add(new ItemDto(ItemProtocol.item_mode, "工作状态", "DB600.B2", Boolean.valueOf(true))); + list.add(new ItemDto(ItemProtocol.item_move, "光电信号", "DB600.B3")); + list.add(new ItemDto(ItemProtocol.item_action, "取放信号", "DB600.B4")); + list.add(new ItemDto(ItemProtocol.item_error, "报警信号", "DB600.B6")); + list.add(new ItemDto(ItemProtocol.item_number, "数量", "DB600.B7")); + list.add(new ItemDto(ItemProtocol.item_task, "任务号", "DB600.D8")); + return list; + } + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java new file mode 100644 index 00000000..2e172188 --- /dev/null +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java @@ -0,0 +1,257 @@ +package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_paint_line; + +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.RouteableDeviceDriver; +import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; +import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.log.service.LogServer; +import org.nl.acs.opc.Device; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.task.service.TaskService; +import org.nl.utils.SpringContextHolder; +import org.openscada.opc.lib.da.Server; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 海亮-油漆线 + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class HailiangPaintLineDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + @Autowired + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + @Autowired + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + @Autowired + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + @Autowired + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + @Autowired + LogServer logServer = SpringContextHolder.getBean(LogServer.class); + + //放货准备锁 + String putReadyLock = null; + //有货标记 + protected boolean has_goods_tag = false; + + int mode = 0; + int error = 0; + int move = 0; + int task = 0; + int action = 0; + int number = 0; + int last_mode = 0; + int last_error = 0; + int last_move = 0; + int last_task = 0; + int last_action = 0; + int last_number = 0; + Boolean isonline = true; + int hasGoods = 0; + String message = null; + Boolean iserror = false; + + + boolean hasVehicle = false; + boolean isReady = false; + protected int instruction_num = 0; + protected int instruction_num_truth = 0; + boolean isFold = false; + private String assemble_check_tag; + + protected String current_stage_instruction_message; + protected String last_stage_instruction_message; + Integer heartbeat_tag; + private Date instruction_require_time = new Date(); + private Date instruction_finished_time = new Date(); + + private int instruction_require_time_out; + boolean requireSucess = false; + + private int instruction_finished_time_out; + + int branchProtocol = 0; + //备注 + String remark; + //物料 + String material; + //当前指令 + Instruction inst = null; + //上次指令 + Instruction last_inst = null; + + //触摸屏手动触发任务 + private Boolean is_has_task = false; + + //申请搬运任务 + private Boolean apply_handling = false; + //申请物料 + private Boolean apply_material = false; + + //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 + int flag; + + String device_code; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + String message = null; + try { + device_code = this.getDeviceCode(); + mode = this.itemProtocol.getMode(); + error = this.itemProtocol.getError(); + action = this.itemProtocol.getAction(); + move = this.itemProtocol.getMove(); + number = this.itemProtocol.getNumber(); + task = this.itemProtocol.getTask(); + hasGoods = this.itemProtocol.getMove(); + + if (mode != last_mode) { + this.setRequireSucess(false); + logServer.deviceLog(this.device_code,"mode" ,String.valueOf(mode)); + logServer.deviceLogToacs(this.device_code,"","","信号mode:" + last_mode + "->" + mode); + } + if (move != last_move) { + logServer.deviceLog(this.device_code,"move" ,String.valueOf(move)); + logServer.deviceLogToacs(this.device_code,"","","信号move:" + last_move + "->" + move); + } + if (error != last_error) { + logServer.deviceLog(this.device_code,"error" ,String.valueOf(error)); + logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); + } + if (action != last_action) { + logServer.deviceLog(this.device_code,"action" ,String.valueOf(action)); + logServer.deviceLogToacs(this.device_code,"","","信号action:" + last_action + "->" + action); + } + if (number != last_number) { + logServer.deviceLog(this.device_code,"number" ,String.valueOf(number)); + logServer.deviceLogToacs(this.device_code,"","","信号number:" + last_number + "->" + number); + } + + } catch (Exception var17) { + return; + } + + if (!this.itemProtocol.getIsonline()) { + this.setIsonline(false); + this.setIserror(true); + message = "信号量同步异常"; + //未联机 + } else if (mode == 0) { + this.setIsonline(false); + this.setIserror(true); + message = "未联机"; + //有报警 + } else if (error != 0) { + this.setIsonline(false); + this.setIserror(true); + message = "有报警"; + //无报警 + } else { + this.setIsonline(true); + this.setIserror(false); + message = ""; + Instruction instruction = null; + List toInstructions; + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + return; + case 2: + break; + } + + switch (flag) { + //取货完成 + case 1: + writing(2); + return; + //放货完成 + case 2: + writing(3); + return; + + } + + } + last_mode = mode; + last_error = error; + last_move = move; + last_task = task; + last_action = action; + last_number = number; + } + + + public boolean exe_error() { + if (this.error == 0) { + return true; + } else { + log.debug("设备报警"); + return false; + } + } + + + public boolean exe_business() { + return true; + } + + public void executing(Server server, Map itemMap) { + ReadUtil.write(itemMap, server); + } + + public void writing(int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command, command); + ReadUtil.write(itemMap, server); + + } + + public void writing(int type, int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + String to_target = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_target; + String to_task = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_task; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + if (type == 1) { + itemMap.put(to_command, command); + } else if (type == 2) { + itemMap.put(to_target, command); + + } else if (type == 3) { + itemMap.put(to_task, command); + } + ReadUtil.write(itemMap, server); + + } +} diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/ItemProtocol.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/ItemProtocol.java new file mode 100644 index 00000000..6bbb6308 --- /dev/null +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/ItemProtocol.java @@ -0,0 +1,113 @@ +package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_paint_line; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Data +public class ItemProtocol { + + public static String item_heartbeat = "heartbeat"; + public static String item_mode = "mode"; + public static String item_move = "move"; + public static String item_action = "action"; + public static String item_error = "error"; + public static String item_number = "number"; + public static String item_task = "task"; + public static String item_to_command = "to_command"; + public static String item_to_target = "to_target"; + public static String item_to_task = "to_task"; + public static String item_weight = "weight"; + + private HailiangPaintLineDeviceDriver driver; + + public ItemProtocol(HailiangPaintLineDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getMove() { + return this.getOpcIntegerValue(item_move); + } + + public int getAction() { + return this.getOpcIntegerValue(item_action); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getNumber() { + return this.getOpcIntegerValue(item_number); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + public int getToCommand() { + return this.getOpcIntegerValue(item_to_command); + } + + public int getToTarget() { + return this.getOpcIntegerValue(item_to_target); + } + + public int getToTask() { + return this.getOpcIntegerValue(item_to_task); + } + + //是否有货 + public int hasGoods(int move) { + return move; + } + + Boolean isonline; + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!"); + setIsonline(false); + } else { + setIsonline(true); + return value; + } + return 0; + + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB600.B0")); + list.add(new ItemDto(item_mode, "工作状态", "DB600.B2", Boolean.valueOf(true))); + list.add(new ItemDto(item_move, "光电信号", "DB600.B3")); + list.add(new ItemDto(item_action, "取放信号", "DB600.B4")); + list.add(new ItemDto(item_error, "报警信号", "DB600.B6")); + list.add(new ItemDto(item_number, "数量", "DB600.B7")); + list.add(new ItemDto(item_task, "任务号", "DB600.D8")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command, "作业命令", "DB601.W2", Boolean.valueOf(true))); + list.add(new ItemDto(item_to_target, "目标站", "DB601.W4")); + list.add(new ItemDto(item_to_task, "任务号", "DB601.D8")); + return list; + } + +} + diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDefination.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDefination.java index 1d297608..f9a28640 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDefination.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDefination.java @@ -61,7 +61,9 @@ public class HailiangThreestationSmartDefination implements OpcDeviceDriverDefin list.add(new ItemDto(ItemProtocol.item_move, "光电信号", "VW4")); list.add(new ItemDto(ItemProtocol.item_action, "取放信号", "VW6")); list.add(new ItemDto(ItemProtocol.item_error, "报警信号", "VW8")); - list.add(new ItemDto(ItemProtocol.item_task, "任务号", "VD10")); + list.add(new ItemDto(ItemProtocol.item_number, "数量", "VW10")); + list.add(new ItemDto(ItemProtocol.item_container_type, "托盘类型", "VW12")); + list.add(new ItemDto(ItemProtocol.item_task, "任务号", "VD14")); return list; } diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java index e140032c..695ef72c 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java @@ -53,10 +53,8 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); - String container; String container_type_desc; String last_container_type_desc; - String last_container; //放货准备锁 String putReadyLock = null; //有货标记 @@ -67,11 +65,15 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv int move = 0; int task = 0; int action = 0; + int number = 0; + int container_type = 0; int last_mode = 0; int last_error = 0; int last_move = 0; int last_task = 0; int last_action = 0; + int last_number = 0; + int last_container_type = 0; Boolean isonline = true; int hasGoods = 0; String message = null; @@ -134,6 +136,8 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv error = this.itemProtocol.getError(); action = this.itemProtocol.getAction(); move = this.itemProtocol.getMove(); + number = this.itemProtocol.getNumber(); + container_type = this.itemProtocol.getContainer_type(); task = this.itemProtocol.getTask(); hasGoods = this.itemProtocol.getMove(); @@ -154,6 +158,14 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv logServer.deviceLog(this.device_code,"action" ,String.valueOf(action)); logServer.deviceLogToacs(this.device_code,"","","信号action:" + last_action + "->" + action); } + if (container_type != last_container_type) { + logServer.deviceLog(this.device_code,"container_type" ,String.valueOf(container_type)); + logServer.deviceLogToacs(this.device_code,"","","信号container_type:" + last_container_type + "->" + container_type); + } + if (number != last_number) { + logServer.deviceLog(this.device_code,"number" ,String.valueOf(number)); + logServer.deviceLogToacs(this.device_code,"","","信号number:" + last_number + "->" + number); + } } catch (Exception var17) { return; @@ -206,6 +218,8 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv last_move = move; last_task = task; last_action = action; + last_number = number; + last_container_type = container_type; } diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/ItemProtocol.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/ItemProtocol.java index 6c094f81..c7ad6d31 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/ItemProtocol.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/ItemProtocol.java @@ -16,6 +16,8 @@ public class ItemProtocol { public static String item_move = "move"; public static String item_action = "action"; public static String item_error = "error"; + public static String item_number = "number"; + public static String item_container_type = "container_type"; public static String item_task = "task"; public static String item_to_command = "to_command"; public static String item_to_target = "to_target"; @@ -48,6 +50,14 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_error); } + public int getNumber() { + return this.getOpcIntegerValue(item_number); + } + + public int getContainer_type() { + return this.getOpcIntegerValue(item_container_type); + } + public int getTask() { return this.getOpcIntegerValue(item_task); } @@ -91,7 +101,9 @@ public class ItemProtocol { list.add(new ItemDto(item_move, "光电信号", "VW4")); list.add(new ItemDto(item_action, "取放信号", "VW6")); list.add(new ItemDto(item_error, "报警信号", "VW8")); - list.add(new ItemDto(item_task, "任务号", "VD10")); + list.add(new ItemDto(item_number, "数量", "VW10")); + list.add(new ItemDto(item_container_type, "托盘类型", "VW12")); + list.add(new ItemDto(item_task, "任务号", "VD14")); return list; } diff --git a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/stage/service/impl/StageActorServiceImpl.java b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/stage/service/impl/StageActorServiceImpl.java index d03b0d43..2561ad7f 100644 --- a/wcs/hd/nladmin-system/src/main/java/org/nl/acs/stage/service/impl/StageActorServiceImpl.java +++ b/wcs/hd/nladmin-system/src/main/java/org/nl/acs/stage/service/impl/StageActorServiceImpl.java @@ -275,76 +275,6 @@ public class StageActorServiceImpl implements StageActorService { continue; } - String move = ""; - String mode = ""; - String action = ""; - - //海亮-三工位Smart200 - HailiangThreestationSmartDeviceDriver hailiangThreestationSmartDeviceDriver; - //海亮-叠盘位Smart200 - HailiangFoldingDiscSmartDeviceDriver hailiangFoldingDiscSmartDeviceDriver; - //海亮-货梯对接线 - HailiangElevatorWiringDeviceDriver hailiangElevatorWiringDeviceDriver; - - if (device.getDeviceDriver() instanceof HailiangThreestationSmartDeviceDriver) { - hailiangThreestationSmartDeviceDriver = (HailiangThreestationSmartDeviceDriver) device.getDeviceDriver(); - if (hailiangThreestationSmartDeviceDriver.getMode() == 0) { - mode = "脱机"; - } else if (hailiangThreestationSmartDeviceDriver.getMode() == 2) { - mode = "待机"; - } else if (hailiangThreestationSmartDeviceDriver.getMode() == 3) { - mode = "运行中"; - } - if (hailiangThreestationSmartDeviceDriver.getMove() == 0) { - move = "无货"; - } else if (hailiangThreestationSmartDeviceDriver.getMove() == 1) { - move = "有货"; - } - if (hailiangThreestationSmartDeviceDriver.getAction() == 0) { - action = "禁止取放"; - } else if (hailiangThreestationSmartDeviceDriver.getAction() == 1) { - action = "允许取货"; - } else if (hailiangThreestationSmartDeviceDriver.getAction() == 2) { - action = "允许放货"; - } else if (hailiangThreestationSmartDeviceDriver.getAction() == 3) { - action = "允许取放"; - } - obj.put("device_name", hailiangThreestationSmartDeviceDriver.getDevice().getDevice_name()); - jo.put("mode", mode); - jo.put("move", move); - jo.put("action", action); - jo.put("hasGoods", hailiangThreestationSmartDeviceDriver.getHasGoods()); - jo.put("isOnline", hailiangThreestationSmartDeviceDriver.getIsonline()); - jo.put("error", hailiangThreestationSmartDeviceDriver.getError()); - jo.put("isError", hailiangThreestationSmartDeviceDriver.getIserror()); - jo.put("container", hailiangThreestationSmartDeviceDriver.getContainer()); - jo.put("message", hailiangThreestationSmartDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof HailiangFoldingDiscSmartDeviceDriver) { - hailiangFoldingDiscSmartDeviceDriver = (HailiangFoldingDiscSmartDeviceDriver) device.getDeviceDriver(); - if (hailiangFoldingDiscSmartDeviceDriver.getMode() == 0) { - mode = "脱机"; - } else if (hailiangFoldingDiscSmartDeviceDriver.getMode() == 2) { - mode = "待机"; - } else if (hailiangFoldingDiscSmartDeviceDriver.getMode() == 3) { - mode = "运行中"; - } - if (hailiangFoldingDiscSmartDeviceDriver.getMove() == 0) { - move = "无货"; - } else if (hailiangFoldingDiscSmartDeviceDriver.getMove() == 1) { - move = "有货"; - } - - obj.put("device_name", hailiangFoldingDiscSmartDeviceDriver.getDevice().getDevice_name()); - jo.put("mode", mode); - jo.put("move", move); - jo.put("number", hailiangFoldingDiscSmartDeviceDriver.getNumber()); - jo.put("hasGoods", hailiangFoldingDiscSmartDeviceDriver.getHasGoods()); - jo.put("isOnline", hailiangFoldingDiscSmartDeviceDriver.getIsonline()); - jo.put("error", hailiangFoldingDiscSmartDeviceDriver.getError()); - jo.put("isError", hailiangFoldingDiscSmartDeviceDriver.getIserror()); - jo.put("container", hailiangFoldingDiscSmartDeviceDriver.getContainer()); - jo.put("message", hailiangFoldingDiscSmartDeviceDriver.getMessage()); - } if (ObjectUtil.isNotEmpty(device.getDeviceDriver())) { IDriverService driverService = applicationContext.getBean(device.getDeviceDriverDefination().getDriverCode(), IDriverService.class); obj.put("device_name", device.getDevice_name()); diff --git a/wcs/qd/src/views/acs/device/config.vue b/wcs/qd/src/views/acs/device/config.vue index 059f7dfb..bee59bfe 100644 --- a/wcs/qd/src/views/acs/device/config.vue +++ b/wcs/qd/src/views/acs/device/config.vue @@ -114,6 +114,7 @@ import hailiang_smart_plc_test from '@/views/acs/device/driver/hailiang_one/hail import hailiang_threestation_smart from '@/views/acs/device/driver/hailiang_one/hailiang_threestation_smart' import hailiang_foldingDisc_smart from '@/views/acs/device/driver/hailiang_one/hailiang_foldingDisc_smart' import hailiang_elevator_wiring from '@/views/acs/device/driver/hailiang_one/hailiang_elevator_wiring' +import hailiang_paint_line from '@/views/acs/device/driver/hailiang_one/hailiang_paint_line' export default { name: 'DeviceConfig', @@ -125,7 +126,8 @@ export default { standard_photoelectric_inspect_site, agv_ndc_two, agv_ndc_one, hailiang_packer_station, hailiang_engraving_cache, hailiang_special_pick_station, hailiang_special_empty_station, hailiang_special_full_station, hailiang_special_pour_station, hailiang_special_device, hailiang_engraving_machine, hailiang_auto_cache_line, hailiang_cleaning_feeding_line, hailiang_cleaning_machine, hailiang_cleaning_machine_storage_station, - hailiang_xj_plc_test, hailiang_smart_plc_test, hailiang_threestation_smart, hailiang_foldingDisc_smart,hailiang_elevator_wiring }, + hailiang_xj_plc_test, hailiang_smart_plc_test, hailiang_threestation_smart, hailiang_foldingDisc_smart,hailiang_elevator_wiring, + hailiang_paint_line }, dicts: ['device_type'], mixins: [crud], data() { diff --git a/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_paint_line.vue b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_paint_line.vue new file mode 100644 index 00000000..015d6264 --- /dev/null +++ b/wcs/qd/src/views/acs/device/driver/hailiang_one/hailiang_paint_line.vue @@ -0,0 +1,487 @@ + + + + + From c124635c6d0b108688afa4416b29135fdac4ccf5 Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Wed, 3 Aug 2022 15:30:36 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes/qd/src/components/Crud/crud.js | 16 ++- .../src/views/wms/mps/produce/AddDialog.vue | 92 ++++++++----- mes/qd/src/views/wms/mps/produce/index.vue | 124 ++++++++++-------- 3 files changed, 142 insertions(+), 90 deletions(-) diff --git a/mes/qd/src/components/Crud/crud.js b/mes/qd/src/components/Crud/crud.js index 3efbbd29..bf10ea42 100644 --- a/mes/qd/src/components/Crud/crud.js +++ b/mes/qd/src/components/Crud/crud.js @@ -1,5 +1,5 @@ -import { download, initData } from '@/api/data' -import { downloadFile, parseTime } from '@/utils/index' +import {download, initData} from '@/api/data' +import {downloadFile, parseTime} from '@/utils/index' import Vue from 'vue' /** @@ -183,6 +183,16 @@ function CRUD(options) { callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form) callVmHook(crud, CRUD.HOOK.afterToCU, crud.form) }, + /** + * 启动复制新增 + * @param {*} data 数据项 + */ + toCopy(data) { + crud.resetForm(JSON.parse(JSON.stringify(data))) + crud.status.add = CRUD.STATUS.PREPARED + callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form) + callVmHook(crud, CRUD.HOOK.afterToCU, crud.form) + }, /** * 启动编辑 * @param {*} data 数据项 @@ -387,7 +397,7 @@ function CRUD(options) { /** * 获取查询参数 */ - getQueryParams: function() { + getQueryParams: function () { // 清除参数无值的情况 Object.keys(crud.query).length !== 0 && Object.keys(crud.query).forEach(item => { if (crud.query[item] === null || crud.query[item] === '') crud.query[item] = undefined diff --git a/mes/qd/src/views/wms/mps/produce/AddDialog.vue b/mes/qd/src/views/wms/mps/produce/AddDialog.vue index 16caca29..1e14a21d 100644 --- a/mes/qd/src/views/wms/mps/produce/AddDialog.vue +++ b/mes/qd/src/views/wms/mps/produce/AddDialog.vue @@ -12,8 +12,9 @@
- + 新增一行 + 复制新增
- +