diff --git a/lms/nladmin-system/pom.xml b/lms/nladmin-system/pom.xml index 6b55ef17b..a8c84288d 100644 --- a/lms/nladmin-system/pom.xml +++ b/lms/nladmin-system/pom.xml @@ -355,6 +355,18 @@ httpclient 4.5.13 + + + com.alibaba + easyexcel + 2.1.6 + + + + org.apache.poi + poi-ooxml-schemas + 3.17 + diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java b/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java index 8d7d93625..475274e80 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java @@ -16,6 +16,7 @@ package org.nl.modules.tools.rest; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -97,4 +98,12 @@ public class LocalStorageController { localStorageService.deleteAll(ids); return new ResponseEntity<>(HttpStatus.OK); } + + @ApiOperation("导入数据") + @PostMapping("/importExcel") + @SaIgnore + public ResponseEntity importExcel(@RequestBody String path) { + localStorageService.importExcel(path); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/LocalStorageService.java b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/LocalStorageService.java index 63ee0aeba..ea1cbba36 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/LocalStorageService.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/LocalStorageService.java @@ -81,4 +81,10 @@ public interface LocalStorageService { * @throws IOException / */ void download(List localStorageDtos, HttpServletResponse response) throws IOException; + + /** + * 导入数据 + * @param path + */ + void importExcel(String path); } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java index fdb1cb450..4753bffe4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java @@ -15,21 +15,23 @@ */ package org.nl.modules.tools.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.FileProperties; import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.FileUtil; -import org.nl.modules.common.utils.PageUtil; -import org.nl.modules.common.utils.QueryHelp; -import org.nl.modules.common.utils.ValidationUtil; +import org.nl.modules.common.utils.*; import org.nl.modules.tools.domain.LocalStorage; import org.nl.modules.tools.repository.LocalStorageRepository; import org.nl.modules.tools.service.LocalStorageService; import org.nl.modules.tools.service.dto.LocalStorageDto; import org.nl.modules.tools.service.dto.LocalStorageQueryCriteria; import org.nl.modules.tools.service.mapstruct.LocalStorageMapper; +import org.nl.modules.wql.core.bean.WQLObject; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -135,4 +137,43 @@ public class LocalStorageServiceImpl implements LocalStorageService { } FileUtil.downloadExcel(list, response); } + + /** + * 导入数据 + * + * @param path + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void importExcel(String path) { + WQLObject measureunitTab = WQLObject.getWQLObject("md_pb_measureunit"); + WQLObject materialbaseTab = WQLObject.getWQLObject("md_me_materialbase"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + List> listMap = EasyExcel.read(path).sheet().doReadSync(); +// listMap.remove(0); + for (int i = 0; i < listMap.size(); i++) { + Map map = listMap.get(i); + String material_code = String.valueOf(map.get(5)); + String material_name = String.valueOf(map.get(6)); + String unit_code = String.valueOf(map.get(7)); + JSONObject object = measureunitTab.query("unit_code = '" + unit_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(object)) throw new BadRequestException("空" + unit_code); + JSONObject material = new JSONObject(); + material.put("material_id", IdUtil.getSnowflake(1, 1).nextId()); + material.put("material_code", material_code); + material.put("material_name", material_name); + material.put("base_unit_id", object.getString("measure_unit_id")); + material.put("is_used", 1); + material.put("is_delete", 0); + material.put("create_id", currentUserId); + material.put("create_name", nickName); + material.put("create_time", now); + material.put("update_optid", currentUserId); + material.put("update_optname", nickName); + material.put("update_time", now); + materialbaseTab.insert(material); + } + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/rest/SubpackagerelationController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/rest/SubpackagerelationController.java new file mode 100644 index 000000000..fda8addb3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/rest/SubpackagerelationController.java @@ -0,0 +1,66 @@ + +package org.nl.wms.pdm.bi.rest; + + +import org.nl.wms.pdm.bi.service.SubpackagerelationService; +import org.nl.wms.pdm.bi.service.dto.SubpackagerelationDto; +import org.springframework.data.domain.Pageable; +import lombok.RequiredArgsConstructor; +import org.nl.modules.logging.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.*; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +/** +* @author lyd +* @date 2022-10-28 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "子卷包装关系管理") +@RequestMapping("/api/subpackagerelation") +@Slf4j +public class SubpackagerelationController { + + private final SubpackagerelationService subpackagerelationService; + + @GetMapping + @Log("查询子卷包装关系") + @ApiOperation("查询子卷包装关系") + //@SaCheckPermission("@el.check('subpackagerelation:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(subpackagerelationService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增子卷包装关系") + @ApiOperation("新增子卷包装关系") + //@SaCheckPermission("@el.check('subpackagerelation:add')") + public ResponseEntity create(@Validated @RequestBody SubpackagerelationDto dto){ + subpackagerelationService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改子卷包装关系") + @ApiOperation("修改子卷包装关系") + //@SaCheckPermission("@el.check('subpackagerelation:edit')") + public ResponseEntity update(@Validated @RequestBody SubpackagerelationDto dto){ + subpackagerelationService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除子卷包装关系") + @ApiOperation("删除子卷包装关系") + //@SaCheckPermission("@el.check('subpackagerelation:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + subpackagerelationService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/SubpackagerelationService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/SubpackagerelationService.java new file mode 100644 index 000000000..22ac54589 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/SubpackagerelationService.java @@ -0,0 +1,65 @@ + +package org.nl.wms.pdm.bi.service; + +import org.nl.wms.pdm.bi.service.dto.SubpackagerelationDto; +import org.springframework.data.domain.Pageable; +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** +* @description 服务接口 +* @author lyd +* @date 2022-10-28 +**/ +public interface SubpackagerelationService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param workorder_id ID + * @return Subpackagerelation + */ + SubpackagerelationDto findById(Long workorder_id); + + /** + * 根据编码查询 + * @param code code + * @return Subpackagerelation + */ + SubpackagerelationDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(SubpackagerelationDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(SubpackagerelationDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/dto/SubpackagerelationDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/dto/SubpackagerelationDto.java new file mode 100644 index 000000000..6df00bfd6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/dto/SubpackagerelationDto.java @@ -0,0 +1,105 @@ +package org.nl.wms.pdm.bi.service.dto; + +import lombok.Data; +import java.math.BigDecimal; +import java.io.Serializable; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + +/** +* @description / +* @author lyd +* @date 2022-10-28 +**/ +@Data +public class SubpackagerelationDto implements Serializable { + + /** 子卷包装标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long workorder_id; + + /** 木箱唯一码 */ + private String package_box_SN; + + /** 箱内子卷数量 */ + private BigDecimal quanlity_in_box; + + /** 木箱自身重量 */ + private BigDecimal box_weight; + + /** 保质期 */ + private BigDecimal quality_guaran_period; + + /** 销售订单及行号 */ + private String sale_order_name; + + /** 客户编号 */ + private String customer_name; + + /** 客户名称 */ + private String customer_description; + + /** 产品编码 */ + private String product_name; + + /** 产品描述 */ + private String product_description; + + /** 入库日期 */ + private String date_of_FG_inbound; + + /** 子卷号 */ + private String container_name; + + /** 产品规格(幅宽) */ + private String width; + + /** 产品厚度 */ + private String thickness; + + /** 单位面积质量 */ + private BigDecimal mass_per_unit_area; + + /** 净重 */ + private BigDecimal net_weight; + + /** 长度 */ + private BigDecimal length; + + /** 制造完成日期 */ + private String date_of_production; + + /** 计划外分切的子卷 */ + private String is_un_plan_production; + + /** 子卷的物性值1 */ + private String un_plan_product_property1; + + /** 子卷的物性值2 */ + private String un_plan_product_property2; + + /** 子卷的物性值3 */ + private String un_plan_product_property3; + + /** 备注 */ + private String remark; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 状态 */ + private String status; + + /** 是否需要重打外包装标签 */ + private String isRePrintPackageBoxLabel; + + /** 是否需要拆包重打子卷标签 */ + private String isUnPackBox; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/impl/SubpackagerelationServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/impl/SubpackagerelationServiceImpl.java new file mode 100644 index 000000000..90e5dc585 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/bi/service/impl/SubpackagerelationServiceImpl.java @@ -0,0 +1,120 @@ + +package org.nl.wms.pdm.bi.service.impl; + + +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.pdm.bi.service.SubpackagerelationService; +import org.nl.wms.pdm.bi.service.dto.SubpackagerelationDto; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import lombok.extern.slf4j.Slf4j; +import cn.hutool.core.util.ObjectUtil; + +/** +* @description 服务实现 +* @author lyd +* @date 2022-10-28 +**/ +@Service +@RequiredArgsConstructor +@Slf4j +public class SubpackagerelationServiceImpl implements SubpackagerelationService { + + @Override + public Map queryAll(Map whereJson, Pageable page){ + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "1=1", "package_box_SN desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson){ + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(SubpackagerelationDto.class); + return null; + } + + @Override + public SubpackagerelationDto findById(Long workorder_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONObject json = wo.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( SubpackagerelationDto.class); + } + return null; + } + + @Override + public SubpackagerelationDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( SubpackagerelationDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(SubpackagerelationDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SubpackagerelationDto dto) { + SubpackagerelationDto entity = this.findById(dto.getWorkorder_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + for (Long workorder_id: ids) { + JSONObject param = new JSONObject(); + param.put("workorder_id", String.valueOf(workorder_id)); + param.put("is_delete", "1"); +// param.put("update_optid", currentUserId); +// param.put("update_optname", nickName); +// param.put("update_time", now); + wo.update(param); + } + } + +} diff --git a/lms/nladmin-system/src/main/resources/template/generator/front/index.ftl b/lms/nladmin-system/src/main/resources/template/generator/front/index.ftl index 1c4665fed..07d095500 100644 --- a/lms/nladmin-system/src/main/resources/template/generator/front/index.ftl +++ b/lms/nladmin-system/src/main/resources/template/generator/front/index.ftl @@ -80,15 +80,15 @@ <#list columns as column> <#if column.columnShow> <#if (column.dictName)?? && (column.dictName)!=""> - + <#elseif column.columnType != 'Timestamp'> - + <#else> - + diff --git a/lms/nladmin-ui/package.json b/lms/nladmin-ui/package.json index 81ea67be7..a92d06891 100644 --- a/lms/nladmin-ui/package.json +++ b/lms/nladmin-ui/package.json @@ -64,6 +64,7 @@ "screenfull": "4.2.0", "sortablejs": "1.8.4", "throttle-debounce": "^5.0.0", + "v-fit-columns": "^0.2.0", "vue": "2.6.10", "vue-color": "^2.8.1", "vue-count-to": "1.0.13", diff --git a/lms/nladmin-ui/src/main.js b/lms/nladmin-ui/src/main.js index 2647e8fcb..ee1942d8d 100644 --- a/lms/nladmin-ui/src/main.js +++ b/lms/nladmin-ui/src/main.js @@ -42,7 +42,7 @@ import '@logicflow/extension/lib/style/index.css' import Tinymce from '@/views/system/build/tinymce/index.vue' import request from '@/utils/request' // 实现 form generator 使用自己定义的 axios request 对象 -import { addDateRange, handleTree, parseTime, resetForm, selectDictLabel, selectDictLabels } from '@/utils/nladmin' +import { addDateRange, handleTree, parseTime, resetForm, selectDictLabel, selectDictLabels, flexWidth } from '@/utils/nladmin' import { getValueByCode } from '@/api/system/param' @@ -59,6 +59,10 @@ Vue.prototype.selectDictLabel = selectDictLabel Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.handleTree = handleTree Vue.prototype.getValueByCode = getValueByCode +Vue.prototype.flexWidth = flexWidth + +import Plugin from 'v-fit-columns' +Vue.use(Plugin) Vue.use(scroll) diff --git a/lms/nladmin-ui/src/utils/nladmin.js b/lms/nladmin-ui/src/utils/nladmin.js index 42ee3a53f..371bcb126 100644 --- a/lms/nladmin-ui/src/utils/nladmin.js +++ b/lms/nladmin-ui/src/utils/nladmin.js @@ -222,3 +222,45 @@ export async function blobValidate(data) { return true } } + +/** + * 自动列宽 + * flexWidth: https://blog.csdn.net/luoyumeiluoyumei/article/details/125853152?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-125853152-blog-123421632.pc_relevant_recovery_v2&spm=1001.2101.3001.4242.2&utm_relevant_index=4 + * @param prop 每列的prop 不能为空 + * @param tableData 表格数据 + * @param title 标题长内容短的,传标题 不能为空 + * @param num 列中有标签等加的富余量 + * @returns 列的宽度 + * 注:prop,title有一个必传 + */ +export function flexWidth(prop, tableData, title, num = 0) { + if (tableData.length === 0) { // 表格没数据不做处理 + return + } + let flexWidth = 0// 初始化表格列宽 + let columnContent = ''// 占位最宽的内容 + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') + context.font = '14px Microsoft YaHei' + // 获取占位最宽的内容 + let index = 0 + for (let i = 0; i < tableData.length; i++) { // 循环表格内容,获取表格内容中最长的数据 + const now_temp = tableData[i][prop] + '' + const max_temp = tableData[index][prop] + '' + const now_temp_w = context.measureText(now_temp).width + const max_temp_w = context.measureText(max_temp).width + if (now_temp_w > max_temp_w) { + index = i + } + } + columnContent = tableData[index][prop] + const column_w = context.measureText(columnContent).width + const title_w = context.measureText(title).width + if (column_w < title_w) { + columnContent = title || '留四个字' + } + // 计算最宽内容的列宽 + const width = context.measureText(columnContent) + flexWidth = width.width + 20 + num + return flexWidth + 'px' +} diff --git a/lms/nladmin-ui/src/views/wms/pdm/bi/index.vue b/lms/nladmin-ui/src/views/wms/pdm/bi/index.vue new file mode 100644 index 000000000..db18e0bbd --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/bi/index.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/bi/subpackagerelation.js b/lms/nladmin-ui/src/views/wms/pdm/bi/subpackagerelation.js new file mode 100644 index 000000000..987d3c5ef --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/bi/subpackagerelation.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/subpackagerelation', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/subpackagerelation/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/subpackagerelation', + method: 'put', + data + }) +} + +export default { add, edit, del }