From 35313ffe430ad0ef6799c60316ce2d7bdfa8b855 Mon Sep 17 00:00:00 2001 From: pang.jiabao <pang_jiabao@163.com> Date: 星期一, 02 九月 2024 13:55:08 +0800 Subject: [PATCH] excel导入单据 --- src/main/resources/mapper/OrderDetlMapper.xml | 17 +++ src/main/java/com/zy/asrs/controller/OrderController.java | 31 ++++++ src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java | 48 ++++----- src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java | 5 + src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java | 150 ++++++++++++++++++++++++++++++ src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java | 20 ++++ src/main/webapp/views/order/order.html | 28 +++++ 7 files changed, 273 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/OrderController.java b/src/main/java/com/zy/asrs/controller/OrderController.java index bf673f9..8465ddb 100644 --- a/src/main/java/com/zy/asrs/controller/OrderController.java +++ b/src/main/java/com/zy/asrs/controller/OrderController.java @@ -1,5 +1,6 @@ package com.zy.asrs.controller; +import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; @@ -11,16 +12,23 @@ import com.zy.asrs.entity.param.OrderDomainParam; import com.zy.asrs.entity.result.WrkTraceVo; +import com.zy.asrs.importexcle.ImportOrderDto; +import com.zy.asrs.importexcle.ImportOrderListener; +import com.zy.asrs.mapper.OrderDetlMapper; import com.zy.asrs.service.*; import com.zy.asrs.utils.FileSaveExampleUtil; import com.zy.common.model.DetlDto; import com.zy.common.web.BaseController; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; +import java.io.IOException; import java.util.*; @RestController @@ -45,6 +53,29 @@ @Autowired private WrkMastLogService wrkMastLogService; + @Resource + private OrderDetlMapper orderDetlMapper; + + @PostMapping("/importOrder") + @ManagerAuth(memo = "鍗曟嵁瀵煎叆") + @ApiOperation(value = "鍗曟嵁瀵煎叆", produces = MediaType.APPLICATION_JSON_VALUE) + public R importOrderData(@RequestParam("file") MultipartFile multipartFile) { + try { + importOrder(multipartFile); + } catch (Exception e) { + e.printStackTrace(); + return R.error(e.getMessage()); + } + return R.ok("瀵煎叆鎴愬姛"); + } + + @Transactional(rollbackFor = Exception.class) + public void importOrder(MultipartFile multipartFile) throws IOException { + // 鑰冩牳鏁版嵁鐨勫垽閲嶄娇鐢╫rder_id,check_type鐨勭粍鍚堝敮涓�绱㈠紩瑙e喅 + EasyExcel.read(multipartFile.getInputStream(), ImportOrderDto.class, + new ImportOrderListener(orderService, orderDetlMapper,docTypeService, snowflakeIdWorker,getUserId())).sheet().doReadSync(); + } + @RequestMapping(value = "/order/nav/list/auth") @ManagerAuth public R navList(@RequestParam(required = false) String orderNo){ diff --git a/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java b/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java new file mode 100644 index 0000000..8395d76 --- /dev/null +++ b/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java @@ -0,0 +1,20 @@ +package com.zy.asrs.importexcle; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * @author pang.jiabao + * @description 瀵煎叆璁㈠崟dto + * @createDate 2024/9/2 9:55 + */ +@Data +public class ImportOrderDto { + + @ExcelProperty(value = "鍖呰缁勫彿",index = 0) + private String column1; + + @ExcelProperty(value = "鍑哄簱鍗曞彿/鍗曟嵁绫诲瀷",index = 1) + private String column2; + +} diff --git a/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java b/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java new file mode 100644 index 0000000..93226be --- /dev/null +++ b/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java @@ -0,0 +1,150 @@ +package com.zy.asrs.importexcle; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.fastjson.JSON; +import com.core.common.DateUtils; +import com.core.common.SnowflakeIdWorker; +import com.zy.asrs.entity.DocType; +import com.zy.asrs.entity.Order; +import com.zy.asrs.entity.OrderDetl; +import com.zy.asrs.mapper.OrderDetlMapper; +import com.zy.asrs.service.DocTypeService; +import com.zy.asrs.service.OrderService; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author pang.jiabao + * @description 瀵煎叆璁㈠崟鐩戝惉鍣� + * @createDate 2024/9/2 9:56 + */ +@Slf4j +public class ImportOrderListener extends AnalysisEventListener<ImportOrderDto> { + /** + * 姣忛殧1000鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀� + */ + private static final int BATCH_COUNT = 400; + + private int count = 0; + + private String orderNo; + + private long orderId; + + List<ImportOrderDto> list = new ArrayList<>(); + /** + * 鍋囪杩欎釜鏄竴涓狣AO锛屽綋鐒舵湁涓氬姟閫昏緫杩欎釜涔熷彲浠ユ槸涓�涓猻ervice銆傚綋鐒跺鏋滀笉鐢ㄥ瓨鍌ㄨ繖涓璞℃病鐢ㄣ�� + */ + private final OrderService orderService; + private final OrderDetlMapper orderDetlMapper; + private final DocTypeService docTypeService; + private final SnowflakeIdWorker snowflakeIdWorker; + private final Long userId; + + /** + * 濡傛灉浣跨敤浜唖pring,璇蜂娇鐢ㄨ繖涓瀯閫犳柟娉曘�傛瘡娆″垱寤篖istener鐨勬椂鍊欓渶瑕佹妸spring绠$悊鐨勭被浼犺繘鏉� + */ + public ImportOrderListener(OrderService orderService, OrderDetlMapper orderDetlMapper,DocTypeService docTypeService, SnowflakeIdWorker snowflakeIdWorker, Long userId) { + this.orderService = orderService; + this.orderDetlMapper = orderDetlMapper; + this.docTypeService = docTypeService; + this.snowflakeIdWorker = snowflakeIdWorker; + this.userId = userId; + } + + /** + * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤 + */ + @SneakyThrows + @Override + public void invoke(ImportOrderDto data, AnalysisContext context) { + log.info("瑙f瀽鍒扮 {} 鏉℃暟鎹�:{}", ++count, JSON.toJSONString(data)); + list.add(data); + if (context.getCurrentRowNum() == 3) { + String time = DateUtils.convert(new Date(),DateUtils.yyyyMMddHHmmss_F); + Order order2 = orderService.selectByNo(list.get(0).getColumn2()); + if(order2 != null) { + throw new ExcelAnalysisException("鍗曟嵁宸插瓨鍦紒"); + } + DocType docType = docTypeService.selectOrAdd(list.get(1).getColumn2(), Boolean.FALSE); + if (docType == null) { + throw new ExcelAnalysisException("鍗曟嵁绫诲瀷閿欒锛�" + list.get(1).getColumn2()); + } + orderNo = list.get(0).getColumn2(); + Order order = new Order(); + order.setUuid(String.valueOf(snowflakeIdWorker.nextId())); + order.setOrderNo(orderNo); + order.setOrderTime(time); + order.setDocType(docType.getDocId()); + order.setSettle(1L); + order.setStatus(1); + order.setCreateBy(userId); + order.setCreateTime(new Date()); + orderService.insert(order); + Order order1 = orderService.selectByNo(orderNo); + orderId = order1.getId(); + list.clear(); + return; + } + + // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM + if (list.size() >= BATCH_COUNT) { + saveData(); + // 瀛樺偍瀹屾垚娓呯悊 list + list.clear(); + } + } + + /** + * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡 閮戒細鏉ヨ皟鐢� + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴� + if (list.size() > 0) { + saveData(); + } + log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒"); + } + + /** + * 鍔犱笂瀛樺偍鏁版嵁搴� + */ + private void saveData() { + log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", list.size()); + log.info("鍗曟嵁鍙凤細{}锛屾暟鎹細{},",orderNo, JSON.toJSONString(list)); + List<OrderDetl> orderDetlList = new ArrayList<>(); + list.forEach(importOrderDto -> { + OrderDetl orderDetl = new OrderDetl(); + orderDetl.setBrand(importOrderDto.getColumn1()); + orderDetl.setBatch(""); + orderDetl.setOrderId(orderId); + orderDetl.setOrderNo(orderNo); + orderDetl.setCreateBy(9527L); + orderDetl.setCreateTime(new Date()); + orderDetl.setUpdateBy(9527L); + orderDetl.setUpdateTime(new Date()); + orderDetl.setStatus(1); + orderDetl.setQty(0.0D); + orderDetl.setAnfme(1.0); + orderDetlList.add(orderDetl); + }); + orderDetlMapper.batchDetls(orderDetlList); + + log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒"); + } + /** + *瑙f瀽鍑虹幇閿欒浼氳繘鍏ヨ鏂规硶 鍏蜂綋鐪嬫簮浠g爜鎴栨枃妗� + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + log.error("澶勭悊寮傚父锛�" + exception.getMessage()); + throw exception; + } +} diff --git a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java index e098f4e..48e8ddf 100644 --- a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java +++ b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java @@ -13,6 +13,11 @@ @Repository public interface OrderDetlMapper extends BaseMapper<OrderDetl> { + /** + * 鎵归噺瀛樺偍鍗曟嵁鏄庣粏 + */ + int batchDetls(@Param("list") List<OrderDetl> list); + OrderDetl selectItem(@Param("orderId") Long orderId, @Param("matnr") String matnr, @Param("batch") String batch); OrderDetl selectItemByOrderNo(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch); diff --git a/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java index 4f2a66d..4f7cc0e 100644 --- a/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java @@ -1,15 +1,12 @@ package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; -import com.core.common.Cools; -import com.core.exception.CoolException; -import com.zy.asrs.mapper.DocTypeMapper; -import com.zy.asrs.entity.DocType; -import com.zy.asrs.service.DocTypeService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.core.common.Cools; +import com.zy.asrs.entity.DocType; +import com.zy.asrs.mapper.DocTypeMapper; +import com.zy.asrs.service.DocTypeService; import org.springframework.stereotype.Service; - -import java.util.Date; @Service("docTypeService") public class DocTypeServiceImpl extends ServiceImpl<DocTypeMapper, DocType> implements DocTypeService { @@ -21,24 +18,25 @@ } DocType docType = this.selectOne(new EntityWrapper<DocType>().eq("doc_name", docName)); if (docType == null) { - long docId = 1L; - DocType last = this.selectOne(new EntityWrapper<DocType>().orderBy("doc_id", false)); - if (last != null) { - docId = last.getDocId() + 1; - } - docType = new DocType(); - docType.setDocId(docId); - docType.setDocName(docName); - if (null != pakin) { - docType.setPakin(pakin ? 1 : 0); - docType.setPakout(pakin ? 0 : 1); - } - docType.setStatus(1); - docType.setCreateTime(new Date()); - docType.setUpdateTime(new Date()); - if (!this.insert(docType)) { - throw new CoolException("鍗曟嵁绫诲瀷閿欒"); - } + return null; +// long docId = 1L; +// DocType last = this.selectOne(new EntityWrapper<DocType>().orderBy("doc_id", false)); +// if (last != null) { +// docId = last.getDocId() + 1; +// } +// docType = new DocType(); +// docType.setDocId(docId); +// docType.setDocName(docName); +// if (null != pakin) { +// docType.setPakin(pakin ? 1 : 0); +// docType.setPakout(pakin ? 0 : 1); +// } +// docType.setStatus(1); +// docType.setCreateTime(new Date()); +// docType.setUpdateTime(new Date()); +// if (!this.insert(docType)) { +// throw new CoolException("鍗曟嵁绫诲瀷閿欒"); +// } } return docType; } diff --git a/src/main/resources/mapper/OrderDetlMapper.xml b/src/main/resources/mapper/OrderDetlMapper.xml index 1fb8461..8c94d80 100644 --- a/src/main/resources/mapper/OrderDetlMapper.xml +++ b/src/main/resources/mapper/OrderDetlMapper.xml @@ -169,6 +169,23 @@ <insert id="addToLogTable"> INSERT INTO man_order_detl_log SELECT * FROM man_order_detl WHERE id = #{id} </insert> + <insert id="batchDetls"> + INSERT INTO + man_order_detl(brand,batch,order_id,order_no,create_by,create_time,status,qty,anfme) + VALUES + <foreach collection="list" item="item" index="index" separator=","> + ( + #{item.brand}, + #{item.batch}, + #{item.orderId}, + #{item.orderNo}, + #{item.createBy}, + #{item.createTime}, + #{item.status}, + #{item.qty}, + #{item.anfme} + )</foreach> + </insert> <update id="increaseQtyByOrderNo"> update man_order_detl diff --git a/src/main/webapp/views/order/order.html b/src/main/webapp/views/order/order.html index 5e0a283..49cbd8b 100644 --- a/src/main/webapp/views/order/order.html +++ b/src/main/webapp/views/order/order.html @@ -82,6 +82,8 @@ </button> <!-- <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon"></i>娣诲姞--> <!-- </button>--> + <input type="file" id="fileInput" accept=".xlsx, .xls"> + <button onclick="exportExc()">瀵煎叆璁㈠崟</button> </div> </div> </div> @@ -96,7 +98,31 @@ </div> </div> </div> +<script> + function exportExc() { + var fileInput = document.getElementById('fileInput'); + var file = fileInput.files[0]; + if (file === undefined) { + alert('璇峰厛閫夋嫨鏂囦欢') + return + } + var formData = new FormData(); + formData.append('file', file); + fetch(baseUrl+'/importOrder', { + method: 'POST', + headers: {'token': localStorage.getItem('token')}, + body: formData + }).then(response => { + response.text().then(data => { + var res = JSON.parse(data) + alert(res.msg) + }) + }).catch(error => { + alert('瀵煎叆寮傚父'); + }); + } +</script> <div id="myModal" style="display: none"> <div style="padding: 10px"> <div class="layui-upload"> @@ -134,7 +160,7 @@ <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">瀹岀粨</a> {{# } }} {{# if (d.settle == 4 && d.tkType=='1') { }} - <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">閫�搴�</a> +<!-- <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">閫�搴�</a>--> {{# } }} </script> <!-- 琛ㄦ牸鎿嶄綔鍒� --> -- Gitblit v1.9.1