feat(inspect): 新增检测标准方法报告文本功能并优化报告生成
- 委托编号生成逻辑调整为下单时生成并校验唯一性,避免审核时重复
- 新增标准模板价格字段及对应的数据模型和数据库映射
- 订单费用详情查询逻辑重构为基于模板价格计算方式
- 新增标准模板与设备绑定关系的数据结构和管理功能
- 委托编号唯一性校验逻辑增强
| | |
| | | package com.ruoyi.basic.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class StandardTreeTemplateBindingVo { |
| | | @ApiModelProperty("模æ¿ID") |
| | | private Integer templateId; |
| | | @ApiModelProperty("模æ¿åç§°") |
| | | private String name; |
| | | @ApiModelProperty("æ£éªé¡¹ç®") |
| | | private String number; |
| | | @ApiModelProperty("夿³¨") |
| | | private String remark; |
| | | @ApiModelProperty("æåº") |
| | | private Integer sort; |
| | | @ApiModelProperty("设å¤IDéå") |
| | | private List<Integer> deviceIds = new ArrayList<>(); |
| | | } |
| | |
| | | package com.ruoyi.basic.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class TemplateBindingItemDto { |
| | | @ApiModelProperty("模æ¿ID") |
| | | private Integer templateId; |
| | | @ApiModelProperty("æåº") |
| | | private Integer sort; |
| | | @ApiModelProperty("设å¤IDéå") |
| | | private List<Integer> deviceIds = new ArrayList<>(); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.StandardTreeTemplateDevice; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** æ 忍¡æ¿é»è®¤è®¾å¤ Mapperã */ |
| | | public interface StandardTreeTemplateDeviceMapper extends BaseMapper<StandardTreeTemplateDevice> { |
| | | |
| | | List<Integer> selectExistingDeviceIds(@Param("deviceIds") List<Integer> deviceIds); |
| | | } |
| | |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty("模æ¿ç¼å·") |
| | | private String number; |
| | | |
| | | /** |
| | | * ä»·æ ¼(å
) |
| | | */ |
| | | @ApiModelProperty("ä»·æ ¼(å
)") |
| | | private BigDecimal price; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** æ åä¸åå§è®°å½æ¨¡æ¿ä¸é»è®¤è®¾å¤çç»å®å
³ç³»ã */ |
| | | @Data |
| | | @TableName("standard_tree_template_device") |
| | | public class StandardTreeTemplateDevice { |
| | | |
| | | @TableId(type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | private Integer standardTreeId; |
| | | |
| | | private Integer templateId; |
| | | |
| | | private Integer deviceId; |
| | | |
| | | private Integer sort; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | } |
| | |
| | | StandardTemplate::getNumber); |
| | | standardTemplate.setNumber(giveCode); |
| | | } |
| | | if (standardTemplate.getPrice() == null) { |
| | | standardTemplate.setPrice(java.math.BigDecimal.ZERO); |
| | | } |
| | | if (StringUtils.isNotBlank(standardTemplate.getThing())) { |
| | | standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing())); |
| | | } else { |
| | |
| | | |
| | | @Override |
| | | public int upStandardTemplate(StandardTemplate standardTemplate) { |
| | | if (standardTemplate.getPrice() == null) { |
| | | standardTemplate.setPrice(java.math.BigDecimal.ZERO); |
| | | } |
| | | if (StringUtils.isNotBlank(standardTemplate.getThing())) { |
| | | standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing())); |
| | | } else { |
| | |
| | | // æ¥è¯¢æ§æ¨¡æ¿ |
| | | StandardTemplate standardTemplate = baseMapper.selectById(newTemplate.getId()); |
| | | newTemplate.setThing(standardTemplate.getThing()); |
| | | if (newTemplate.getPrice() == null) { |
| | | newTemplate.setPrice(java.math.BigDecimal.ZERO); |
| | | } |
| | | |
| | | if (StringUtils.isBlank(newTemplate.getNumber())) { |
| | | String giveCode = numberGenerator.generateNumberWithPrefix(5, |
| | |
| | | import com.ruoyi.basic.mapper.StandardProductListMapper; |
| | | import com.ruoyi.basic.mapper.StandardTreeMapper; |
| | | import com.ruoyi.basic.mapper.StandardTreeTemplateBindingMapper; |
| | | import com.ruoyi.basic.mapper.StandardTreeTemplateDeviceMapper; |
| | | import com.ruoyi.basic.mapper.StructureItemParameterMapper; |
| | | import com.ruoyi.basic.mapper.StructureTestObjectMapper; |
| | | import com.ruoyi.basic.pojo.Laboratory; |
| | |
| | | import com.ruoyi.basic.pojo.StandardTree; |
| | | import com.ruoyi.basic.pojo.StandardTemplate; |
| | | import com.ruoyi.basic.pojo.StandardTreeTemplateBinding; |
| | | import com.ruoyi.basic.pojo.StandardTreeTemplateDevice; |
| | | import com.ruoyi.basic.pojo.StructureItemParameter; |
| | | import com.ruoyi.basic.pojo.StructureTestObject; |
| | | import com.ruoyi.basic.service.StandardTreeService; |
| | |
| | | import java.util.HashSet; |
| | | import java.util.Comparator; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author Administrator |
| | |
| | | private LaboratoryMapper laboratoryMapper; |
| | | |
| | | private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper; |
| | | |
| | | private StandardTreeTemplateDeviceMapper standardTreeTemplateDeviceMapper; |
| | | |
| | | private StandardTemplateService standardTemplateService; |
| | | |
| | |
| | | } |
| | | standardTreeTemplateBindingMapper.delete(Wrappers.<StandardTreeTemplateBinding>lambdaQuery() |
| | | .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTree.getId())); |
| | | standardTreeTemplateDeviceMapper.delete(Wrappers.<StandardTreeTemplateDevice>lambdaQuery() |
| | | .eq(StandardTreeTemplateDevice::getStandardTreeId, standardTree.getId())); |
| | | standardTreeMapper.deleteById(standardTree.getId()); |
| | | standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaQuery() |
| | | .eq(StandardProductList::getLaboratory, industry) |
| | |
| | | Wrappers.<StandardTreeTemplateBinding>lambdaQuery() |
| | | .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTreeId) |
| | | .orderByAsc(StandardTreeTemplateBinding::getSort, StandardTreeTemplateBinding::getId)); |
| | | Map<Integer, List<Integer>> deviceIdsByTemplate = standardTreeTemplateDeviceMapper.selectList( |
| | | Wrappers.<StandardTreeTemplateDevice>lambdaQuery() |
| | | .eq(StandardTreeTemplateDevice::getStandardTreeId, standardTreeId) |
| | | .orderByAsc(StandardTreeTemplateDevice::getSort, |
| | | StandardTreeTemplateDevice::getId)) |
| | | .stream().collect(Collectors.groupingBy( |
| | | StandardTreeTemplateDevice::getTemplateId, |
| | | LinkedHashMap::new, |
| | | Collectors.mapping(StandardTreeTemplateDevice::getDeviceId, Collectors.toList()))); |
| | | List<StandardTreeTemplateBindingVo> result = new ArrayList<>(); |
| | | for (StandardTreeTemplateBinding binding : bindings) { |
| | | StandardTemplate template = standardTemplateService.getById(binding.getTemplateId()); |
| | |
| | | vo.setNumber(template.getNumber()); |
| | | vo.setRemark(template.getRemark()); |
| | | vo.setSort(binding.getSort()); |
| | | vo.setDeviceIds(deviceIdsByTemplate.getOrDefault(template.getId(), new ArrayList<>())); |
| | | result.add(vo); |
| | | } |
| | | return result; |
| | |
| | | ensureTwoLevelStandard(dto.getStandardTreeId()); |
| | | List<TemplateBindingItemDto> templates = dto.getTemplates() == null ? new ArrayList<>() : dto.getTemplates(); |
| | | Set<Integer> templateIds = new HashSet<>(); |
| | | Set<Integer> allDeviceIds = new HashSet<>(); |
| | | List<StandardTreeTemplateBinding> bindings = new ArrayList<>(); |
| | | int index = 0; |
| | | for (TemplateBindingItemDto item : templates) { |
| | |
| | | binding.setTemplateId(item.getTemplateId()); |
| | | binding.setSort(item.getSort() == null ? index : item.getSort()); |
| | | bindings.add(binding); |
| | | if (item.getDeviceIds() != null) { |
| | | allDeviceIds.addAll(item.getDeviceIds().stream() |
| | | .filter(Objects::nonNull).collect(Collectors.toSet())); |
| | | } |
| | | index++; |
| | | } |
| | | if (!allDeviceIds.isEmpty()) { |
| | | List<Integer> requestedDeviceIds = new ArrayList<>(allDeviceIds); |
| | | if (standardTreeTemplateDeviceMapper.selectExistingDeviceIds(requestedDeviceIds).size() |
| | | != requestedDeviceIds.size()) { |
| | | throw new BaseException("æé设å¤ä¸åå¨ï¼è¯·å·æ°è®¾å¤å表åéè¯"); |
| | | } |
| | | } |
| | | standardTreeTemplateDeviceMapper.delete(Wrappers.<StandardTreeTemplateDevice>lambdaQuery() |
| | | .eq(StandardTreeTemplateDevice::getStandardTreeId, dto.getStandardTreeId())); |
| | | standardTreeTemplateBindingMapper.delete(Wrappers.<StandardTreeTemplateBinding>lambdaQuery() |
| | | .eq(StandardTreeTemplateBinding::getStandardTreeId, dto.getStandardTreeId())); |
| | | for (StandardTreeTemplateBinding binding : bindings) { |
| | | for (int bindingIndex = 0; bindingIndex < bindings.size(); bindingIndex++) { |
| | | StandardTreeTemplateBinding binding = bindings.get(bindingIndex); |
| | | standardTreeTemplateBindingMapper.insert(binding); |
| | | TemplateBindingItemDto item = templates.get(bindingIndex); |
| | | List<Integer> deviceIds = item.getDeviceIds() == null ? new ArrayList<>() |
| | | : item.getDeviceIds().stream().filter(Objects::nonNull).distinct() |
| | | .collect(Collectors.toList()); |
| | | for (int deviceIndex = 0; deviceIndex < deviceIds.size(); deviceIndex++) { |
| | | StandardTreeTemplateDevice relation = new StandardTreeTemplateDevice(); |
| | | relation.setStandardTreeId(dto.getStandardTreeId()); |
| | | relation.setTemplateId(item.getTemplateId()); |
| | | relation.setDeviceId(deviceIds.get(deviceIndex)); |
| | | relation.setSort(deviceIndex); |
| | | standardTreeTemplateDeviceMapper.insert(relation); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | |
| | | |
| | | <select id="selectStandardTemplatePageList" resultType="com.ruoyi.basic.pojo.StandardTemplate"> |
| | | select * from ( |
| | | select st.id, st.name,st.number, st.remark, u2.name create_user_name, u3.name update_user_name, st.create_time, st.update_time |
| | | select st.id, st.name,st.number, st.price, st.remark, u2.name create_user_name, u3.name update_user_name, st.create_time, st.update_time |
| | | from standard_template st |
| | | left join user u2 on u2.id = st.create_user |
| | | left join user u3 on u3.id = st.update_user |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
| | | <mapper namespace="com.ruoyi.basic.mapper.StandardTreeTemplateDeviceMapper"> |
| | | <select id="selectExistingDeviceIds" resultType="java.lang.Integer"> |
| | | select id from device where id in |
| | | <foreach collection='deviceIds' item='deviceId' open='(' separator=',' close=')'> |
| | | #{deviceId} |
| | | </foreach> |
| | | </select> |
| | | </mapper> |
| | |
| | | |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.common.core.domain.Result; |
| | | import com.ruoyi.inspect.dto.SampleOrderDto; |
| | | import com.ruoyi.inspect.pojo.InsOrderRates; |
| | | import com.ruoyi.inspect.service.InsOrderRatesService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | |
| | | @ApiOperation(value = "æ¥è¯¢è®¢åè´¹ç¨è¯¦æ
") |
| | | @GetMapping("/selectRatesDetail") |
| | | public Result selectRatesDetail(Page page, Integer insOrderId) { |
| | | return Result.success(insOrderRatesService.page(page, Wrappers.<InsOrderRates>lambdaQuery() |
| | | .eq(InsOrderRates::getInsOrderId, insOrderId))); |
| | | return Result.success(insOrderRatesService.selectTemplateRatesDetail(page, insOrderId)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.inspect.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class TemplateRateDto { |
| | | @ApiModelProperty("æ£éªé¡¹ç®") |
| | | private String number; |
| | | @ApiModelProperty("模æ¿åç§°") |
| | | private String name; |
| | | @ApiModelProperty("ä»·æ ¼(å
)") |
| | | private BigDecimal price; |
| | | } |
| | |
| | | |
| | | String getStandardMethodCode(@Param("id") Integer id); |
| | | |
| | | String getStandardMethodReportText(@Param("id") Integer id); |
| | | |
| | | String getStandardMethodReportTextByCode(@Param("code") String code); |
| | | |
| | | int updateStatus(@Param("id") Integer id); |
| | | |
| | | String selLaboratoryCode(@Param("laboratory") String laboratory); |
| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.inspect.dto.SampleOrderDto; |
| | | import com.ruoyi.inspect.dto.TemplateRateDto; |
| | | import com.ruoyi.inspect.pojo.InsOrderRates; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | |
| | | * @return |
| | | */ |
| | | IPage<SampleOrderDto> selectInsOrderRates(Page page, @Param("ew") QueryWrapper<SampleOrderDto> ew); |
| | | |
| | | /** |
| | | * æ¥è¯¢è®¢åè´¹ç¨è¯¦æ
ï¼æ¨¡æ¿ä»·æ ¼ï¼ |
| | | * @return |
| | | */ |
| | | IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, @Param("insOrderId") Integer insOrderId); |
| | | } |
| | | |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.inspect.dto.SampleOrderDto; |
| | | import com.ruoyi.inspect.dto.TemplateRateDto; |
| | | import com.ruoyi.inspect.pojo.InsOrderRates; |
| | | |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | IPage<SampleOrderDto> selectInsOrderRates(Page page, SampleOrderDto sampleOrderDto); |
| | | |
| | | /** |
| | | * æ¥è¯¢è®¢åè´¹ç¨è¯¦æ
ï¼æ¨¡æ¿ä»·æ ¼ï¼ |
| | | * @param page |
| | | * @param insOrderId |
| | | * @return |
| | | */ |
| | | IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, Integer insOrderId); |
| | | } |
| | | |
| | |
| | | import com.ruoyi.inspect.service.*; |
| | | import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; |
| | | import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler; |
| | | import com.ruoyi.inspect.util.ReportSignaturePictureUtils; |
| | | import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo; |
| | | import com.ruoyi.inspect.vo.InsOrderPlanVO; |
| | | import com.ruoyi.inspect.vo.InsSampleUserVO; |
| | |
| | | .last("FOR UPDATE")); |
| | | boolean isInspectionReport = Objects.equals(INSPECTION_REPORT, reportType); |
| | | registerInsResults = isInspectionReport && Boolean.TRUE.equals(registerInsResults); |
| | | // 1. 夿æ¯å¦æéå¤ç¼å·, æéå¤ç¼å·åæé |
| | | // 1. å§æç¼å·å
¨å±å¯ä¸ï¼æäº¤å¤æ ¸æ¶åæ¬¡æ ¡éªï¼é²æ¢å¹¶åæå岿°æ®ç»è¿çææ ¡éªã |
| | | Long codeCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery() |
| | | .ne(InsOrder::getState, -1) |
| | | .ne(InsOrder::getIfsInventoryId, order.getIfsInventoryId()) |
| | | .ne(InsOrder::getId, orderId) |
| | | .eq(InsOrder::getEntrustCode, order.getEntrustCode())); |
| | | if (codeCount > 0) { |
| | | throw new ErrorException("å½åç¼å·æéå¤, 请å
å»ä¿®æ¹éå¤ç¼å·"); |
| | | throw new ErrorException("æ ·å/å§æåå·²åå¨ï¼è¯·ç¡®è®¤æ ·åç¼å·"); |
| | | } |
| | | |
| | | // 2. å¤æè¯¥è®¢åæ¯å¦æ¯ç¬¬ä¸æ¬¡ç产(åç»æ¥åçæåªåç¬¬ä¸æ¬¡æäº¤æ¶é´) |
| | |
| | | || report.getExamineTime() != null; |
| | | if (submitted) { |
| | | User writer = getReportSigner(report.getWriteUserId(), "ç¼å¶äºº"); |
| | | marks.put("writeUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create()); |
| | | marks.put("writeUrl", ReportSignaturePictureUtils.create(imgUrl, writer.getSignatureUrl())); |
| | | marks.put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getWriteTime())).create()); |
| | | marks.put("insUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create()); |
| | | marks.put("insUrl", ReportSignaturePictureUtils.create(imgUrl, writer.getSignatureUrl())); |
| | | } |
| | | if (Objects.equals(report.getIsExamine(), 1)) { |
| | | User examiner = getReportSigner(report.getExamineUserId(), "å®¡æ ¸äºº"); |
| | | marks.put("examineUrl", Pictures.ofLocal(imgUrl + "/" + examiner.getSignatureUrl()).create()); |
| | | marks.put("examineUrl", ReportSignaturePictureUtils.create(imgUrl, examiner.getSignatureUrl())); |
| | | marks.put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getExamineTime())).create()); |
| | | } |
| | | return marks; |
| | |
| | | enterFactoryReport.setLotBatchNo(ifsInventoryQuantity.getUpdateBatchNo()); |
| | | |
| | | // æ£æµä¾æ® |
| | | Set<String> standardMethod = new HashSet<>(); |
| | | Set<String> standardMethod = new LinkedHashSet<>(); |
| | | StringBuilder standardMethod2 = new StringBuilder(); |
| | | standardMethod.add(baseMapper.getStandardMethodCode(insSample.getStandardMethodListId())); |
| | | String reportStandardMethod = baseMapper.getStandardMethodReportText(insSample.getStandardMethodListId()); |
| | | if (StringUtils.isNotBlank(reportStandardMethod)) { |
| | | standardMethod.add(reportStandardMethod); |
| | | } |
| | | for (String s : standardMethod) { |
| | | standardMethod2.append("ã").append(s); |
| | | } |
| | | standardMethod2.replace(0, 1, ""); |
| | | if (standardMethod2.length() > 0) { |
| | | standardMethod2.deleteCharAt(0); |
| | | } |
| | | |
| | | // æ ·åç±»å |
| | | String orderType = iSysDictTypeService.selectLabelByDict(DictDataConstants.CHECK_TYPE, insOrder.getOrderType()); |
| | |
| | | insReport.setReportType(reportType); |
| | | boolean showResult = Objects.equals(reportType, INSPECTION_REPORT); |
| | | List<Map<String, Object>> tables = new ArrayList<>(); |
| | | Set<String> standardMethod = new HashSet<>(); |
| | | Set<String> standardMethod = new LinkedHashSet<>(); |
| | | Set<String> deviceSet = new HashSet<>(); |
| | | Set<String> models = new HashSet<>(); |
| | | // æ¥è¯¢æ£éªé¡¹æ°é |
| | |
| | | /*åºç¡æ¥å(æ ¹æ®ç»å¶çåå§è®°å½æ¨¡çå½¢æ)*/ |
| | | samples.forEach(a -> { |
| | | models.add(a.getModel()); |
| | | String standardMethodCode = baseMapper.getStandardMethodCode(a.getStandardMethodListId()); |
| | | if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) { |
| | | standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod(); |
| | | String standardMethodCode = baseMapper.getStandardMethodReportText(a.getStandardMethodListId()); |
| | | if (StrUtil.isNotBlank(standardMethodCode)) { |
| | | if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) { |
| | | standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod(); |
| | | } |
| | | standardMethod.add(standardMethodCode); |
| | | } |
| | | standardMethod.add(standardMethodCode); |
| | | for (InsProduct b : a.getInsProduct()) { |
| | | if (b.getInsProductResult() != null) { |
| | | List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class); |
| | |
| | | if (firstInspectDate == null) { |
| | | firstInspectDate = insOrder.getSendTime(); |
| | | } |
| | | if (firstInspectDate == null) { |
| | | firstInspectDate = submitTime; |
| | | } |
| | | |
| | | String insTime = firstInspectDate.format(DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥")) + "-" |
| | | + submitTime.format(DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥")); |
| | | String testStartDate = firstInspectDate.format(DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥")); |
| | | String testEndDate = submitTime.format(DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥")); |
| | | |
| | | String insTimeEn = monthNames[firstInspectDate.getMonthValue() - 1] + " " + firstInspectDate.format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-" |
| | | + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy")); |
| | |
| | | productionDate = insOrder.getProductionDate().format(DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥")); |
| | | } |
| | | batchNo = defaultReportText(insOrder.getProductionBatch(), "/"); |
| | | standardMethodText = templateSnapshots.stream() |
| | | .map(InsOrderStandardTemplate::getRemark) |
| | | .filter(StringUtils::isNotBlank) |
| | | .distinct() |
| | | .collect(Collectors.joining("ï¼")); |
| | | standardMethodText = defaultReportText( |
| | | baseMapper.getStandardMethodReportTextByCode(insOrder.getSample()), insOrder.getSample()); |
| | | } |
| | | boolean containsOrganicChlorine = detectionResultRows.stream() |
| | | .map(row -> row.get("itemName")) |
| | |
| | | put("batch", finalBatchNo); |
| | | put("phone", defaultReportText(insOrder.getPhone(), "/")); |
| | | put("testDate", insTime); |
| | | put("testStartDate", testStartDate); |
| | | put("testEndDate", testEndDate); |
| | | put("entrustNo", defaultReportText(insOrder.getEntrustCode(), "/")); |
| | | put("sampling", "/"); |
| | | put("standard", finalStandardMethodText); |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.utils.QueryWrappers; |
| | | import com.ruoyi.inspect.dto.SampleOrderDto; |
| | | import com.ruoyi.inspect.dto.TemplateRateDto; |
| | | import com.ruoyi.inspect.mapper.InsOrderRatesMapper; |
| | | import com.ruoyi.inspect.pojo.InsOrderRates; |
| | | import com.ruoyi.inspect.service.InsOrderRatesService; |
| | |
| | | public IPage<SampleOrderDto> selectInsOrderRates(Page page, SampleOrderDto sampleOrderDto) { |
| | | return baseMapper.selectInsOrderRates(page, QueryWrappers.queryWrappers(sampleOrderDto)); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<TemplateRateDto> selectTemplateRatesDetail(Page page, Integer insOrderId) { |
| | | return baseMapper.selectTemplateRatesDetail(page, insOrderId); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | }); |
| | | // ä¸åæ¶çæå§æç¼å·å¹¶æ ¡éªå¯ä¸æ§ï¼å£åº¦æ£éªå¤ç¨è¿åæ£éªç¼å·ï¼çå¾
å®¡æ ¸å¤çã |
| | | if (!InsOrderTypeConstants.QUARTERLY_TEST.equals(insOrder.getOrderType())) { |
| | | String entrustCode = buildEntrustCode(insOrder, Collections.emptyList()); |
| | | assertEntrustCodeUnique(entrustCode, insOrder.getId()); |
| | | insOrder.setEntrustCode(entrustCode); |
| | | insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate() |
| | | .eq(InsOrder::getId, insOrder.getId()) |
| | | .set(InsOrder::getEntrustCode, entrustCode)); |
| | | } |
| | | //åææä¸åæå¤è´æåä¸å |
| | | if (Objects.nonNull(insOrder.getTypeSource())&&Objects.nonNull(insOrder.getIfsInventoryId())) { |
| | | // å§æäººå°±æ¯æ¥æ£äºº, ç产åä½å°±æ¯ä¾åºååä½ |
| | |
| | | product.setSort(productSort++); |
| | | insProductMapper.insert(product); |
| | | } |
| | | saveTemplateSnapshots(order.getId(), selections); |
| | | saveTemplateSnapshots(order.getId(), selections, bindingMap); |
| | | |
| | | // ä¸åæ¶çæå§æç¼å·å¹¶æ ¡éªå¯ä¸æ§ï¼éå¤åæç¤ºï¼é¿å
çå°å®¡æ ¸ææ¥éã |
| | | String entrustCode = buildEntrustCode(order, Collections.singletonList(sample)); |
| | | assertEntrustCodeUnique(entrustCode, order.getId()); |
| | | insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate() |
| | | .eq(InsOrder::getId, order.getId()) |
| | | .set(InsOrder::getEntrustCode, entrustCode)); |
| | | return order.getId(); |
| | | } |
| | | |
| | | private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections) { |
| | | private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections, |
| | | Map<Integer, StandardTreeTemplateBindingVo> bindingMap) { |
| | | for (OrderTemplateSelectionDto selection : selections) { |
| | | StandardTemplate template = standardTemplateService.getById(selection.getTemplateId()); |
| | | if (template == null) { |
| | |
| | | snapshot.setThing(template.getThing()); |
| | | snapshot.setSort(selection.getSort()); |
| | | insOrderStandardTemplateMapper.insert(snapshot); |
| | | |
| | | StandardTreeTemplateBindingVo binding = bindingMap.get(selection.getTemplateId()); |
| | | List<Integer> deviceIds = binding == null || binding.getDeviceIds() == null |
| | | ? Collections.emptyList() : binding.getDeviceIds(); |
| | | for (int index = 0; index < deviceIds.size(); index++) { |
| | | InsOrderTemplateDevice relation = new InsOrderTemplateDevice(); |
| | | relation.setInsOrderId(orderId); |
| | | relation.setTemplateId(selection.getTemplateId()); |
| | | relation.setDeviceId(deviceIds.get(index)); |
| | | relation.setSort(index); |
| | | insOrderTemplateDeviceMapper.insert(relation); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | public int upInsOrderOfState(InsOrder insOrder) { |
| | | insOrder.setExamineTime(LocalDateTime.now()); |
| | | if (insOrder.getState() == 1) { |
| | | //å®¡æ ¸éè¿æä¼çæå§æç¼å· |
| | | //å§æç¼å·å·²å¨ä¸åæ¶çæå¹¶æ ¡éªå¯ä¸æ§ï¼å®¡æ ¸æ¶å¤ç¨ï¼åå²/å£åº¦æ£éªè®¢åå
åºçæã |
| | | InsOrder order = this.getById(insOrder.getId()); |
| | | List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery() |
| | | .eq(InsSample::getInsOrderId, insOrder.getId()) |
| | | .orderByAsc(InsSample::getId)); |
| | | // å§æç¼å·æéæ ·æ¥æçæï¼æ°èåæ ·å订åçæ«ä¸¤ä½åæ ·åç¼å·æ«ä¸¤ä½ã |
| | | // åå²/å¤é¨è®¢åæªå¡«åéæ ·æ¥ææ¶åéå°å½å¤©ï¼é¿å
å½±ååææµç¨ã |
| | | LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate(); |
| | | String entrustCodePrefix = "LMSY-" |
| | | + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE) |
| | | + "-"; |
| | | String no; |
| | | if (isDirectTemplateOrder(order, insSamples)) { |
| | | String sampleCode = insSamples.get(0).getSampleCode(); |
| | | if (StringUtils.isBlank(sampleCode) || sampleCode.trim().length() < 2) { |
| | | throw new ErrorException("æ ·åç¼å·ä¸è½ä¸ºç©ºä¸ä¸è½å°äº2ä½"); |
| | | } |
| | | sampleCode = sampleCode.trim(); |
| | | no = entrustCodePrefix + sampleCode.substring(sampleCode.length() - 2); |
| | | } else { |
| | | no = numberGenerator.generateNumberWithPrefix(2, |
| | | entrustCodePrefix, |
| | | InsOrder::getEntrustCode); |
| | | } |
| | | String no = order.getEntrustCode(); |
| | | // 夿æ¯å¦æ¯å£åº¦æ£éª, æ¯å£åº¦æ£éªåæ¶åææå£åº¦æ£éªä¸å |
| | | if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) { |
| | | ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate() |
| | |
| | | no = order1.getEntrustCode(); |
| | | } |
| | | } |
| | | if (StringUtils.isBlank(no)) { |
| | | no = buildEntrustCode(order, insSamples); |
| | | } |
| | | assertEntrustCodeUnique(no, order.getId()); |
| | | |
| | | int count = 1; |
| | | for (InsSample insSample : insSamples) { |
| | |
| | | return insOrderMapper.updateById(insOrder); |
| | | } |
| | | |
| | | /** |
| | | * å§æç¼å·å
¨å±å¯ä¸ï¼çæç¼å·ååç»æäº¤ååéæé¤å½å订ååæ ¡éªã |
| | | */ |
| | | private void assertEntrustCodeUnique(String entrustCode, Integer currentOrderId) { |
| | | Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery() |
| | | .eq(InsOrder::getEntrustCode, entrustCode) |
| | | .ne(currentOrderId != null, InsOrder::getId, currentOrderId)); |
| | | if (count > 0) { |
| | | throw new ErrorException("æ ·å/å§æåå·²åå¨ï¼è¯·ç¡®è®¤æ ·åç¼å·"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çæå§æç¼å·ï¼æ°èç´ç»æ¨¡æ¿è®¢åæ«ä¸¤ä½åæ ·åç¼å·æ«ä¸¤ä½ï¼å
¶ä½æéæ ·æ¥æçæåºå·ã |
| | | */ |
| | | private String buildEntrustCode(InsOrder order, List<InsSample> insSamples) { |
| | | LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate(); |
| | | String entrustCodePrefix = "LMSY-" |
| | | + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE) |
| | | + "-"; |
| | | if (isDirectTemplateOrder(order, insSamples)) { |
| | | String sampleCode = insSamples.get(0).getSampleCode(); |
| | | if (StringUtils.isBlank(sampleCode) || sampleCode.trim().length() < 2) { |
| | | throw new ErrorException("æ ·åç¼å·ä¸è½ä¸ºç©ºä¸ä¸è½å°äº2ä½"); |
| | | } |
| | | sampleCode = sampleCode.trim(); |
| | | return entrustCodePrefix + sampleCode.substring(sampleCode.length() - 2); |
| | | } |
| | | return numberGenerator.generateNumberWithPrefix(2, entrustCodePrefix, InsOrder::getEntrustCode); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | |
| | | import com.ruoyi.inspect.service.InsReportService; |
| | | import com.ruoyi.inspect.service.RawMaterialOrderService; |
| | | import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler; |
| | | import com.ruoyi.inspect.util.ReportSignaturePictureUtils; |
| | | import com.ruoyi.system.mapper.UserMapper; |
| | | import com.ruoyi.system.service.InformationNotificationService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | } |
| | | |
| | | Map<String, Object> writeMarks = new HashMap<String, Object>() {{ |
| | | put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | put("writeUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl)); |
| | | put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create()); |
| | | put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | put("insUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl)); |
| | | }}; |
| | | writeMarksToReportFiles(insReport, writeMarks); |
| | | |
| | |
| | | informationNotificationService.addInformationNotification(info); |
| | | String primaryReportUrl = getPrimaryReportUrl(insReport); |
| | | Map<String, Object> examineMarks = new HashMap<String, Object>() {{ |
| | | put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | put("examineUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl)); |
| | | put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create()); |
| | | }}; |
| | | writeMarksToReportFiles(insReport, examineMarks); |
| | |
| | | String finalUrl = primaryReportUrl.replace("/word", wordUrl); |
| | | |
| | | Map<String, Object> ratifyMarks = new HashMap<String, Object>() {{ |
| | | put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | put("ratifyUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl)); |
| | | put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create()); |
| | | put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); |
| | | put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.inspect.util; |
| | | |
| | | import com.deepoove.poi.data.PictureRenderData; |
| | | import com.deepoove.poi.data.Pictures; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | |
| | | /** |
| | | * æ¥åç¾åå¾çå·¥å
·ã |
| | | */ |
| | | public final class ReportSignaturePictureUtils { |
| | | |
| | | private static final int MAX_WIDTH = 90; |
| | | private static final int MAX_HEIGHT = 45; |
| | | |
| | | private ReportSignaturePictureUtils() { |
| | | } |
| | | |
| | | /** |
| | | * æåå§æ¯ä¾å°ç¾åéé
å°æ¥åç¾ååå
æ ¼ï¼é¿å
å¾çè¶è¿åå
æ ¼è¾¹çè被è£åªã |
| | | */ |
| | | public static PictureRenderData create(String imageDirectory, String signatureUrl) { |
| | | String signaturePath = imageDirectory + "/" + signatureUrl; |
| | | try { |
| | | BufferedImage image = ImageIO.read(new File(signaturePath)); |
| | | if (image != null && image.getWidth() > 0 && image.getHeight() > 0) { |
| | | double scale = Math.min((double) MAX_WIDTH / image.getWidth(), |
| | | (double) MAX_HEIGHT / image.getHeight()); |
| | | int width = Math.max(1, (int) Math.round(image.getWidth() * scale)); |
| | | int height = Math.max(1, (int) Math.round(image.getHeight() * scale)); |
| | | return Pictures.ofLocal(signaturePath).size(width, height).create(); |
| | | } |
| | | } catch (IOException ignored) { |
| | | // å¾çå
æ°æ®è¯»å失败æ¶ä»å¯å°è¯ä»¥é»è®¤å°ºå¯¸åå
¥æ¥åã |
| | | } |
| | | return Pictures.ofLocal(signaturePath).size(MAX_WIDTH, MAX_HEIGHT).create(); |
| | | } |
| | | } |
| | |
| | | from standard_method |
| | | where id = #{id} |
| | | </select> |
| | | <select id="getStandardMethodReportText" resultType="java.lang.String"> |
| | | select case |
| | | when name is null or trim(name) = '' then code |
| | | else concat(code, 'ã', name, 'ã') |
| | | end |
| | | from standard_method |
| | | where id = #{id} |
| | | </select> |
| | | <select id="getStandardMethodReportTextByCode" resultType="java.lang.String"> |
| | | select case |
| | | when name is null or trim(name) = '' then code |
| | | else concat(code, 'ã', name, 'ã') |
| | | end |
| | | from standard_method |
| | | where code = #{code} |
| | | limit 1 |
| | | </select> |
| | | <select id="selLaboratoryCode" resultType="java.lang.String"> |
| | | select laboratory_code |
| | | from laboratory |
| | |
| | | then io.sample_view |
| | | else io.sample end sampleStr, |
| | | GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model, |
| | | sum(tempior.rates) + 200 total_price |
| | | COALESCE(sum(st.price), 0) total_price |
| | | from ins_order io |
| | | LEFT JOIN ins_sample isa ON isa.ins_order_id = io.id |
| | | left join ( |
| | | select ior.id, ior.ins_order_id, ior.rates from |
| | | ins_order_rates ior |
| | | left join ins_product ip on ip.id = ior.ins_product_id |
| | | left join ins_order io2 on ior.ins_order_id = io2.id |
| | | GROUP BY CASE |
| | | WHEN ior.man_hour_group IS NOT NULL AND ior.man_hour_group != '' THEN ior.man_hour_group |
| | | ELSE ior.id END, |
| | | CASE WHEN ior.man_hour_group IS NOT NULL AND ior.man_hour_group != '' THEN ior.ins_sample_id ELSE ior.id END, |
| | | CASE WHEN ior.man_hour_group IS NOT NULL AND ior.man_hour_group != '' THEN ip.radius ELSE ior.id END, |
| | | CASE WHEN ior.man_hour_group IS NOT NULL AND ior.man_hour_group != '' THEN ip.cable_tag ELSE ior.id END, |
| | | CASE WHEN ior.man_hour_group IS NOT NULL AND ior.man_hour_group != '' THEN ior.ins_order_id ELSE ior.id END) tempior on tempior.ins_order_id = io.id |
| | | where tempior.id is not null |
| | | left join ins_order_standard_template iost on iost.ins_order_id = io.id |
| | | left join standard_template st on st.id = iost.template_id |
| | | where iost.id is not null |
| | | group by io.id) a |
| | | <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> |
| | | ${ew.customSqlSegment} |
| | | </if> |
| | | </select> |
| | | |
| | | <!-- æ¥è¯¢è®¢åè´¹ç¨è¯¦æ
ï¼æ¨¡æ¿ä»·æ ¼ï¼ --> |
| | | <select id="selectTemplateRatesDetail" resultType="com.ruoyi.inspect.dto.TemplateRateDto"> |
| | | select iost.number, iost.name, COALESCE(st.price, 0) as price |
| | | from ins_order_standard_template iost |
| | | left join standard_template st on st.id = iost.template_id |
| | | where iost.ins_order_id = #{insOrderId} |
| | | order by iost.sort, iost.id |
| | | </select> |
| | | |
| | | </mapper> |