|
@@ -0,0 +1,336 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions are met:
|
|
|
+ *
|
|
|
+ * Redistributions of source code must retain the above copyright notice,
|
|
|
+ * this list of conditions and the following disclaimer.
|
|
|
+ * Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ * Neither the name of the dreamlu.net developer nor the names of its
|
|
|
+ * contributors may be used to endorse or promote products derived from
|
|
|
+ * this software without specific prior written permission.
|
|
|
+ * Author: Chill 庄骞 (smallchill@163.com)
|
|
|
+ */
|
|
|
+package org.springblade.business.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import org.jsoup.Jsoup;
|
|
|
+import org.jsoup.nodes.Document;
|
|
|
+import org.jsoup.nodes.Element;
|
|
|
+import org.jsoup.select.Elements;
|
|
|
+import org.springblade.business.entity.TrialAutoNumber;
|
|
|
+import org.springblade.business.entity.TrialNumberRule;
|
|
|
+import org.springblade.business.vo.TrialNumberRuleVO;
|
|
|
+import org.springblade.business.mapper.TrialNumberRuleMapper;
|
|
|
+import org.springblade.business.service.ITrialNumberRuleService;
|
|
|
+import org.springblade.business.vo.TrialNumberRuleVO1;
|
|
|
+import org.springblade.common.constant.CommonConstant;
|
|
|
+import org.springblade.common.utils.CommonUtil;
|
|
|
+import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
+import org.springblade.core.log.exception.ServiceException;
|
|
|
+import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
+import org.springblade.core.redis.cache.BladeRedis;
|
|
|
+import org.springblade.core.secure.BladeUser;
|
|
|
+import org.springblade.core.tool.utils.IoUtil;
|
|
|
+import org.springblade.core.tool.utils.ResourceUtil;
|
|
|
+import org.springblade.manager.entity.WbsTreePrivate;
|
|
|
+import org.springblade.system.cache.ParamCache;
|
|
|
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
+import org.springframework.jdbc.core.SingleColumnRowMapper;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.FileNotFoundException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 服务实现类
|
|
|
+ *
|
|
|
+ * @author BladeX
|
|
|
+ * @since 2025-06-10
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class TrialNumberRuleServiceImpl extends BaseServiceImpl<TrialNumberRuleMapper, TrialNumberRule> implements ITrialNumberRuleService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private JdbcTemplate jdbcTemplate;
|
|
|
+ @Resource
|
|
|
+ private BladeRedis bladeRedis;
|
|
|
+ @Resource
|
|
|
+ private TrialAutoNumberServiceImpl trialAutoNumberService;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<TrialNumberRuleVO> selectTrialNumberRulePage(IPage<TrialNumberRuleVO> page, TrialNumberRuleVO trialNumberRule) {
|
|
|
+ return page.setRecords(baseMapper.selectTrialNumberRulePage(page, trialNumberRule));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String,String> getTrialNumber(Long projectId,Long contractId, Integer type,Long nodeId,Boolean isSaveRedis) {
|
|
|
+ HashMap<String, String> map = new HashMap<>();
|
|
|
+ StringBuilder trialNumber = new StringBuilder();
|
|
|
+ List<TrialNumberRule> rules;
|
|
|
+ if(contractId==null||contractId==0L){
|
|
|
+ rules = baseMapper.selectList(Wrappers.<TrialNumberRule>query().lambda().eq(TrialNumberRule::getProjectId, projectId).eq(TrialNumberRule::getType, type).eq(TrialNumberRule::getStatus,1).orderByAsc(TrialNumberRule::getSort));
|
|
|
+ }else {
|
|
|
+ rules = baseMapper.selectList(Wrappers.<TrialNumberRule>query().lambda().eq(TrialNumberRule::getContractId, contractId).eq(TrialNumberRule::getType, type).eq(TrialNumberRule::getStatus,2).orderByAsc(TrialNumberRule::getSort));
|
|
|
+ }
|
|
|
+ for (TrialNumberRule rule : rules) {
|
|
|
+ if(rule.getRule()==1){
|
|
|
+ trialNumber.append(rule.getData());
|
|
|
+ } else if (rule.getRule()==2) {
|
|
|
+ if(contractId!=null&&contractId!=0L){
|
|
|
+ String sql1="select contract_number from m_contract_info where id="+contractId;
|
|
|
+ String result = jdbcTemplate.query(sql1, rs -> {
|
|
|
+ if (rs.next()) {
|
|
|
+ return rs.getString(1);
|
|
|
+ } else {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ });
|
|
|
+ trialNumber.append(result);
|
|
|
+ }else {
|
|
|
+ trialNumber.append("合同段编号");
|
|
|
+ }
|
|
|
+ } else if (rule.getRule()==3) {
|
|
|
+ if (nodeId!=null) {
|
|
|
+ String sql2="select unique_code from m_wbs_tree_private where p_key_id="+nodeId+" and is_deleted=0";
|
|
|
+ String result = jdbcTemplate.query(sql2, rs -> {
|
|
|
+ if (rs.next()) {
|
|
|
+ return rs.getString(1);
|
|
|
+ } else {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ });
|
|
|
+ trialNumber.append(result);
|
|
|
+ }
|
|
|
+ } else if (rule.getRule()==4) {
|
|
|
+ String currentYearStr = String.valueOf(LocalDate.now().getYear());
|
|
|
+ trialNumber.append(currentYearStr);
|
|
|
+ } else if (rule.getRule()==5) {
|
|
|
+ int currentMonthValue = LocalDate.now().getMonthValue();
|
|
|
+ String currentMonthStr = String.format("%02d", currentMonthValue);
|
|
|
+ trialNumber.append(currentMonthStr);
|
|
|
+ } else if (rule.getRule()==6) {
|
|
|
+ if(rule.getIsAutoIncrement()!=null&&rule.getIsAutoIncrement()==1){
|
|
|
+ String autoIncrementNumber="";
|
|
|
+ //如果是需要自增的 先要查出当前数据库中自增编号的最大值
|
|
|
+ String sql3 = "SELECT MAX(auto_increment_number) FROM u_trial_auto_number where is_deleted=0";
|
|
|
+ String maxNumber = jdbcTemplate.query(sql3, rs -> {
|
|
|
+ if (rs.next()) {
|
|
|
+ return rs.getObject(1, String.class);
|
|
|
+ } else {
|
|
|
+ return rule.getData();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ String sql4="select auto_increment_number FROM u_trial_auto_number where is_deleted=0 ORDER BY auto_increment_number ASC";
|
|
|
+ List<String> autoNumbers = jdbcTemplate.query(sql4, new SingleColumnRowMapper<>(String.class));
|
|
|
+ //判断自增的流水号是否是连续的 是连续的就在最大值加1,不是连续的先使用缺失的编号
|
|
|
+ List<String> missingNumbers = findMissingNumberPatterns(autoNumbers);
|
|
|
+ if(missingNumbers.isEmpty()){
|
|
|
+ while (true){
|
|
|
+ maxNumber=incrementFormattedNumberWithCheck(maxNumber);
|
|
|
+ Object o = bladeRedis.get("trialAutoNumber:" + contractId + ":" + type + ":" + nodeId + ":" + "lock:" + maxNumber);
|
|
|
+ if(o==null){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ autoIncrementNumber=maxNumber;
|
|
|
+
|
|
|
+ }else {
|
|
|
+ for (int i = 0; i < missingNumbers.size(); i++) {
|
|
|
+ autoIncrementNumber=missingNumbers.get(i);
|
|
|
+ Object o = bladeRedis.get("trialAutoNumber:" + contractId + ":" + type + ":" + nodeId + ":" + "lock:" + autoIncrementNumber);
|
|
|
+ if(o==null){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ autoIncrementNumber="";
|
|
|
+ }
|
|
|
+ if(autoIncrementNumber.equals("")){
|
|
|
+ while (true){
|
|
|
+ maxNumber=incrementFormattedNumberWithCheck(maxNumber);
|
|
|
+ Object o = bladeRedis.get("trialAutoNumber:" + contractId + ":" + type + ":" + nodeId + ":" + "lock:" + maxNumber);
|
|
|
+ if(o==null){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ autoIncrementNumber=String.valueOf(maxNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isSaveRedis) {
|
|
|
+ bladeRedis.setEx("trialAutoNumber:" + contractId + ":" + type + ":" + nodeId + ":" + "lock:" + autoIncrementNumber , autoIncrementNumber,30 * 60 * 1000L);
|
|
|
+ }
|
|
|
+ map.put("autoIncrementNumber",autoIncrementNumber);
|
|
|
+ trialNumber.append(autoIncrementNumber);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ trialNumber.append(rule.getData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ map.put("trialNumber",trialNumber.toString());
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String incrementFormattedNumberWithCheck(String data) {
|
|
|
+ if (data == null || data.isEmpty()) {
|
|
|
+ return "0";
|
|
|
+ }
|
|
|
+
|
|
|
+ int length = data.length();
|
|
|
+ int number = Integer.parseInt(data);
|
|
|
+ number += 1;
|
|
|
+
|
|
|
+ // 检查自增后的数字位数是否超过原始数据的长度
|
|
|
+ if (String.valueOf(number).length() > length) {
|
|
|
+ throw new ServiceException("自增后的编号超出原始格式位数限制:" + data);
|
|
|
+ }
|
|
|
+
|
|
|
+ return String.format("%0" + length + "d", number);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<String> findMissingNumberPatterns(List<String> autoNumbersStr) {
|
|
|
+ if (autoNumbersStr == null || autoNumbersStr.size() <= 1) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取数字和最大长度
|
|
|
+ List<Long> numbers = new ArrayList<>();
|
|
|
+ int maxLength = 0;
|
|
|
+
|
|
|
+ for (String s : autoNumbersStr) {
|
|
|
+ try {
|
|
|
+ Long num = Long.parseLong(s);
|
|
|
+ numbers.add(num);
|
|
|
+ maxLength = Math.max(maxLength, s.length());
|
|
|
+ } catch (NumberFormatException ignored) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (numbers.size() <= 1) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ numbers.sort(Long::compareTo);
|
|
|
+
|
|
|
+ long start = numbers.get(0);
|
|
|
+ long end = numbers.get(numbers.size() - 1);
|
|
|
+ Set<Long> numberSet = new HashSet<>(numbers);
|
|
|
+
|
|
|
+ List<String> missing = new ArrayList<>();
|
|
|
+
|
|
|
+ for (long i = start; i <= end; i++) {
|
|
|
+ if (!numberSet.contains(i)) {
|
|
|
+ // 使用原始最长字符串的长度进行格式化
|
|
|
+ String formatted = String.format("%0" + maxLength + "d", i);
|
|
|
+ missing.add(formatted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return missing;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TrialNumberRuleVO1 getTrialNumberRule(Long projectId,Long contractId, Integer type) {
|
|
|
+ TrialNumberRuleVO1 vo1 = new TrialNumberRuleVO1();
|
|
|
+ List<TrialNumberRule> trialNumberRules;
|
|
|
+ if(contractId==0L){
|
|
|
+ trialNumberRules = baseMapper.selectList(Wrappers.<TrialNumberRule>query().lambda().eq(TrialNumberRule::getProjectId, projectId).eq(TrialNumberRule::getType, type).eq(TrialNumberRule::getStatus,1).orderByAsc(TrialNumberRule::getSort));
|
|
|
+ }else {
|
|
|
+ trialNumberRules = baseMapper.selectList(Wrappers.<TrialNumberRule>query().lambda().eq(TrialNumberRule::getContractId, contractId).eq(TrialNumberRule::getType, type).eq(TrialNumberRule::getStatus,2).orderByAsc(TrialNumberRule::getSort));
|
|
|
+ }
|
|
|
+ Map<String, String> map = getTrialNumber(projectId,contractId, type, null, false);
|
|
|
+ vo1.setList(trialNumberRules);
|
|
|
+ vo1.setTrialNumber(map.get("trialNumber"));
|
|
|
+ return vo1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * type 1材料 2样品 3委托单 4记录表 5报告表
|
|
|
+ * @param projectId
|
|
|
+ * @param contractId
|
|
|
+ * @param type
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean clearTrialNumber(Long projectId, Long contractId, Integer type) {
|
|
|
+ if(contractId!=null&&contractId!=0L){
|
|
|
+ String update;
|
|
|
+ if(type==1){
|
|
|
+ update="update u_trial_material_mobilization set material_number IS NULL where contract_id="+contractId;
|
|
|
+ } else if (type==2) {
|
|
|
+ update="update u_trial_sample_info set specification_number IS NULL where contract_id="+contractId;
|
|
|
+ } else if (type==3) {
|
|
|
+ update="update u_entrust_info set entrust_no IS NULL where contract_id="+contractId+" and status=1";
|
|
|
+ } else if (type==4) {
|
|
|
+ update="update u_trial_self_inspection_record set record_no IS NULL where contract_id="+contractId+" and task_status='未上报'";
|
|
|
+ }else{
|
|
|
+ update="update u_trial_self_inspection_record set report_no IS NULL where contract_id="+contractId+" and task_status='未上报'";
|
|
|
+ }
|
|
|
+ jdbcTemplate.execute(update);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, String> getEntrustNumber(Long pkeyId,Long contractId) throws FileNotFoundException {
|
|
|
+ String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
|
|
|
+ String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
|
|
|
+ String sql="Select html_url from m_wbs_tree_private where p_key_id="+pkeyId;
|
|
|
+ WbsTreePrivate wbsTreePrivate = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
|
|
|
+ String fileUrl = wbsTreePrivate.getHtmlUrl();
|
|
|
+ File file1 = ResourceUtil.getFile(fileUrl);
|
|
|
+ InputStream fileInputStream;
|
|
|
+ if (file1.exists()) {
|
|
|
+ fileInputStream = new FileInputStream(file1);
|
|
|
+ } else {
|
|
|
+ String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
|
|
|
+ fileInputStream = CommonUtil.getOSSInputStream(path);
|
|
|
+ }
|
|
|
+ String htmlString = IoUtil.readToString(fileInputStream);
|
|
|
+ htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
|
|
|
+ htmlString = htmlString.replaceAll("title", "titlexx");
|
|
|
+ Document doc = Jsoup.parse(htmlString);
|
|
|
+ Elements elementsWithPlaceholderxx = doc.select("el-input[placeholder~=.*委托单编号.*]");
|
|
|
+ if(!elementsWithPlaceholderxx.isEmpty()){
|
|
|
+ Element first = elementsWithPlaceholderxx.first();
|
|
|
+ String key = first.attr("id");
|
|
|
+ Map<String, String> map = getTrialNumber(Long.valueOf(wbsTreePrivate.getProjectId()),contractId, 3, pkeyId, true);
|
|
|
+ map.put(key,map.get("trialNumber"));
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void checkSave(Long contractId,Integer type,Long formDataId,String autoNumber){
|
|
|
+ List<TrialNumberRule> list = baseMapper.selectList(Wrappers.<TrialNumberRule>query().lambda().eq(TrialNumberRule::getContractId, contractId).eq(TrialNumberRule::getType, type).eq(TrialNumberRule::getStatus,2).orderByAsc(TrialNumberRule::getSort));
|
|
|
+ if(list!=null&&list.size()>0){
|
|
|
+ List<TrialNumberRule> collect = list.stream().filter(o -> o.getRule() == 6 && o.getIsAutoIncrement() == 1).collect(Collectors.toList());
|
|
|
+ if(!collect.isEmpty()){
|
|
|
+ TrialAutoNumber one = trialAutoNumberService.getOne(Wrappers.lambdaQuery(TrialAutoNumber.class).eq(TrialAutoNumber::getFormDataId, formDataId).eq(TrialAutoNumber::getType, 4));
|
|
|
+ if(one==null){
|
|
|
+ TrialAutoNumber trialAutoNumber = new TrialAutoNumber();
|
|
|
+ trialAutoNumber.setId(SnowFlakeUtil.getId());
|
|
|
+ trialAutoNumber.setType(type);
|
|
|
+ trialAutoNumber.setNumberRuleId(collect.get(0).getId());
|
|
|
+ trialAutoNumber.setFormDataId(formDataId);
|
|
|
+ trialAutoNumber.setAutoIncrementNumber(autoNumber);
|
|
|
+ trialAutoNumberService.save(trialAutoNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|