diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java index 8b9b2805..6c62803e 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/rest/AcceptFormulaController.java @@ -15,6 +15,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; /** @@ -117,4 +119,12 @@ public class AcceptFormulaController { public ResponseEntity autoCalculation(@RequestParam Map whereJson) { return new ResponseEntity<>(acceptFormulaService.autoCalculation(whereJson),HttpStatus.OK); } + + @Log("打印excel") + @ApiOperation("打印excel") + @GetMapping(value = "/print") + public ResponseEntity preview(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + acceptFormulaService.preview(response,whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java index 33929ed4..d7e07ccb 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/AcceptFormulaService.java @@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONObject; import org.nl.wms.pf.service.dto.ProductbomDto; import org.springframework.data.domain.Pageable; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -103,4 +105,7 @@ public interface AcceptFormulaService { * 提交 */ JSONArray autoCalculation(Map whereJson); + + void preview(HttpServletResponse response, Map whereJson) throws IOException; + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java index 3d9c6ed0..e8bb7440 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/AcceptFormulaServiceImpl.java @@ -3,23 +3,32 @@ package org.nl.wms.pf.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.spire.xls.Workbook; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.exception.BadRequestException; import org.nl.modules.security.service.dto.JwtUserDto; +import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SecurityUtils; +import org.nl.utils.SpringContextHolder; import org.nl.wms.basedata.master.constant.MaterOptTypeEnum; import org.nl.wms.pf.service.AcceptFormulaService; import org.nl.wms.pf.service.AcceptMarkService; import org.nl.wms.pf.service.dto.ProductbomDto; +import org.nl.wms.test.service.dto.DataDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.nl.wql.util.WqlUtil; @@ -27,10 +36,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; /** @@ -354,6 +364,118 @@ public class AcceptFormulaServiceImpl implements AcceptFormulaService { return result; } + @Override + @Transactional(rollbackFor = Exception.class) + public void preview(HttpServletResponse response, Map whereJson) throws IOException { + WQLObject formMstTab = WQLObject.getWQLObject("QL_TEST_AcceptFormula"); // 小线试验配方主表 + WQLObject formDtlTab = WQLObject.getWQLObject("QL_TEST_AcceptFormulaDtl"); // 小线试验配方明细表 + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); // 物料表 + WQLObject factMstTab = WQLObject.getWQLObject("QL_TEST_FactoryWarrantyMst"); // 厂家质保书主表 + WQLObject factDtlTab = WQLObject.getWQLObject("QL_TEST_FactoryWarrantyDtl"); // 厂家质保书明细表 + WQLObject markTab = WQLObject.getWQLObject("QL_TEST_AcceptMark"); // 验收牌号表 + WQLObject classTab = WQLObject.getWQLObject("md_pb_classstandard"); // 基本分类表表 + + String formula_id = MapUtil.getStr(whereJson, "formula_id"); + JSONObject jsonFormMst = formMstTab.query("formula_id = '" + formula_id + "'").uniqueResult(0); + JSONObject jsonMater = materTab.query("material_id = '" + jsonFormMst.getString("material_id") + "'").uniqueResult(0); + + // 创建workbook 并获取模板路径 + Workbook workbook = new Workbook(); + String template = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("ACCEPT_EXCEL_PATH").getValue(); + + workbook.loadFromFile(template); + + // 设置文件名和防止乱码现象 + String fileName = URLEncoder.encode(jsonMater.getString("material_code")+"-"+jsonFormMst.getString("material_pcsn"), "UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename*=UTf-8''"+fileName+".xlsx"); + // 获取输出流 + ServletOutputStream outputStream = response.getOutputStream(); + // 创建模板工作簿 + ExcelWriter workBook = EasyExcel.write(outputStream, DataDto.class).withTemplate(template).build(); + // 获取第一个sheet + WriteSheet sheet = EasyExcel.writerSheet().build(); + + /* + * 单组填充 + */ + HashMap oneMap = new HashMap<>(); + //型号 + oneMap.put("material_name", jsonMater.getString("material_name")); + + // 厂家 + JSONObject jsonFactMst = factMstTab.query("material_id = '" + jsonFormMst.getString("material_id") + "' and pcsn = '" + jsonFormMst.getString("material_pcsn") + "' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonFactMst)) oneMap.put("manufactor", jsonFactMst.getString("manufactor")); + + // 实验牌号 + JSONObject jsonMark= markTab.query("mark_id = '" + jsonFormMst.getString("mark_id") + "' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonMark)) { + oneMap.put("mark_code", jsonMark.getString("mark_code")); + + // 酒精体积:液料比*开单总重 + double bar_bulk = NumberUtil.mul(jsonFormMst.getDoubleValue("confirm_qty"), jsonMark.getDoubleValue("liquid_rate")); + oneMap.put("bar_bulk", NumberUtil.round(bar_bulk, 3).toString()); + + // 合金球重量:球料比*开单总重 + double ball_rate_2 = NumberUtil.mul(jsonFormMst.getDoubleValue("confirm_qty"), jsonMark.getDoubleValue("ball_rate")); + double ball_weight = NumberUtil.div(ball_rate_2, 1000); + oneMap.put("ball_weight", NumberUtil.round(ball_weight, 3).toString()); + + // 球磨时间 + oneMap.put("ball_time", jsonMark.getString("ball_time")); + + // 转速 + oneMap.put("ball_speed", jsonMark.getString("ball_speed")); + + // 原料总碳 + oneMap.put("c_balance", jsonMark.getString("c_balance")); + } + + // 实验批号 + oneMap.put("accept_pcsn", jsonFormMst.getString("accept_pcsn")); + + // 碳平衡:厂家质保书明细对应 + String inspection_item_id = "1510155749437870083"; // ct项点标识 + JSONObject jsonFactDtl = factDtlTab.query("inspection_id = '" + jsonFactMst.getString("inspection_id") + "' and inspection_item_id = '" + inspection_item_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonFactDtl)) { + oneMap.put("ct_value", NumberUtil.round(jsonFactDtl.getString("value"), 2).toString()); + } + + // 开单日期 + oneMap.put("create_time", jsonFormMst.getString("create_time").substring(0,10)); + + /* + * 多组填充 + */ + ArrayList> flData = new ArrayList<>(); + // 查询小线实验配方明细表 + JSONArray formDtlArr = formDtlTab.query("formula_id = '" + jsonFormMst.getString("formula_id") + "'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(formDtlArr)) { + for (int i = 0; i < formDtlArr.size(); i++) { + JSONObject json = formDtlArr.getJSONObject(i); + HashMap mapFL = new HashMap<>(); + // 判断物料物料类别是 物料还是物料分类 + String class_name = ""; + if (StrUtil.equals(json.getString("material_type"), "01")) { + // 物料:查物料表关联分类表 + JSONObject jsonDtlMater = materTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + JSONObject jsonDtlClass = classTab.query("class_id = '" + jsonDtlMater.getString("material_type_id") + "'").uniqueResult(0); + class_name = jsonDtlClass.getString("class_name"); + } else { + // 分类:直接用明细表的物料标识查基础分类表 + JSONObject jsonDtlClass = classTab.query("class_id = '" + json.getString("material_id") + "'").uniqueResult(0); + class_name = jsonDtlClass.getString("class_name"); + } + mapFL.put("class_name", class_name); + mapFL.put("dtl_pcsn", json.getString("dtl_pcsn")); + mapFL.put("formula_qty", NumberUtil.round(json.getString("formula_qty"), 3).toString()); + flData.add(mapFL); + } + } + workBook.fill(oneMap, sheet); + workBook.fill(new FillWrapper("data", flData), sheet); + workBook.finish(); + } + /** * 新料模式开单 * @param json diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java index 18529b8d..3ffcee91 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pf/service/impl/FormulaServiceImpl.java @@ -47,6 +47,7 @@ import java.awt.print.Paper; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.IOException; +import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; @@ -778,7 +779,7 @@ public class FormulaServiceImpl implements FormulaService { } // 球磨相关 oneMap.put("ball_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("ball_rate"))); - oneMap.put("liquid_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("liquid_rate"))); +// oneMap.put("liquid_rate",NumberUtil.mul(jsonWork.getDoubleValue("workorder_qty"),jsonMaterExt.getDoubleValue("liquid_rate"))); if (ObjectUtil.isNotEmpty(json98jj)) { if (StrUtil.equals(json98jj.getString("value"), "1.00")) { oneMap.put("para_name", json98jj.getString("para_name")); @@ -806,10 +807,15 @@ public class FormulaServiceImpl implements FormulaService { if (ObjectUtil.isNotEmpty(jsonQM04)) oneMap.put("pre_time", jsonQM04.getString("value")); if (ObjectUtil.isNotEmpty(jsonQM06)) { + // 预磨酒精 String pre_fas = NumberUtil.mul(masterbucket_qty, NumberUtil.div(jsonQM06.getString("value"), "100").toString()).toString(); oneMap.put("pre_fas", NumberUtil.round(pre_fas, 2).toString()); - String put_fas = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), NumberUtil.div(jsonQM06.getString("value"), "100")).toString(); + // 投料酒精 + double mul_1 = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), jsonMaterExt.getDoubleValue("liquid_rate")); + BigDecimal mul_2 = NumberUtil.mul(jsonMst.getDoubleValue("masterbucket_qty"), NumberUtil.div(jsonQM06.getString("value"), "100")); + String put_fas = NumberUtil.sub(mul_1, mul_2).toString(); + oneMap.put("put_fas", NumberUtil.round(put_fas, 2).toString()); } diff --git a/mes/qd/src/views/wms/pf/acceptformula/index.vue b/mes/qd/src/views/wms/pf/acceptformula/index.vue index 5308e84c..2c1823a5 100644 --- a/mes/qd/src/views/wms/pf/acceptformula/index.vue +++ b/mes/qd/src/views/wms/pf/acceptformula/index.vue @@ -98,6 +98,8 @@ type="warning" icon="el-icon-check" size="mini" + :disabled="crud.selections.length !== 1" + @click="printExcel" > 打印 @@ -147,6 +149,8 @@ import pagination from '@crud/Pagination' import AddDialog from '@/views/wms/pf/acceptformula/AddDialog' import ViewDialog from '@/views/wms/pf/acceptformula/ViewDialog' import Date from '@/utils/datetime' +import {download} from "@/api/data"; +import {downloadFile} from "@/utils"; export default { name: 'Acceptformula', @@ -229,6 +233,17 @@ export default { }, querytable() { this.crud.toQuery() + }, + printExcel() { + const _selectData = this.$refs.table.selection + const data = _selectData[0] + download('/api/acceptformula/print', { 'formula_id': data.formula_id }).then(result => { + const name = data.material_code + data.accept_pcsn + downloadFile(result, name, 'xlsx') + crud.downloadLoading = false + }).catch(() => { + crud.downloadLoading = false + }) } } }