diff --git a/src/com/api/secret/web/AutoGenerateNumberController.java b/src/com/api/secret/web/AutoGenerateNumberController.java new file mode 100644 index 0000000..c0e6862 --- /dev/null +++ b/src/com/api/secret/web/AutoGenerateNumberController.java @@ -0,0 +1,12 @@ +package com.api.secret.web; + +import javax.ws.rs.Path; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +@Path("/secret/auto/number") +public class AutoGenerateNumberController extends com.engine.secret.web.AutoGenerateNumberController{ +} diff --git a/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java b/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java new file mode 100644 index 0000000..c41f429 --- /dev/null +++ b/src/com/engine/secret/entity/autonumber/AcceptanceNumber.java @@ -0,0 +1,24 @@ +package com.engine.secret.entity.autonumber; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AcceptanceNumber { + private Integer id; + private Integer year; + private Integer month; + private Integer monthlySerial; + private Integer globalSerial; + private Integer secretType; +} diff --git a/src/com/engine/secret/instance/AutoGenerateNumberInstance.java b/src/com/engine/secret/instance/AutoGenerateNumberInstance.java new file mode 100644 index 0000000..20b598e --- /dev/null +++ b/src/com/engine/secret/instance/AutoGenerateNumberInstance.java @@ -0,0 +1,199 @@ +package com.engine.secret.instance; + +import cn.hutool.core.convert.Convert; +import com.engine.secret.entity.autonumber.AcceptanceNumber; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.util.ModeUtil; +import weaver.conn.RecordSetTrans; +import weaver.formmode.IgnoreCaseHashMap; +import weaver.general.Util; + +import java.time.LocalDate; +import java.util.Map; +import java.util.UUID; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberInstance { + private static final String TABLE_NAME = "uf_sldh"; + + private static AutoGenerateNumberInstance instance = new AutoGenerateNumberInstance(); + + private AutoGenerateNumberInstance() { + // 私有化构造方法 + } + + public static AutoGenerateNumberInstance getInstance() { + return instance; + } + + public synchronized String getAcceptanceNumber(Map param) { + RecordSetTrans rs = new RecordSetTrans(); + rs.setAutoCommit(false); + try { + Integer secretType = Convert.toInt(param.get("secretType")); + String requestId = Util.null2String(param.get("requestId")); + + LocalDate now = LocalDate.now(); + int year = now.getYear(); + int currentMonth = now.getMonthValue(); + + + AcceptanceNumber yearNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = 0 FOR UPDATE", secretType, year); + if (rs.next()) { + yearNumber = getSelectNum(rs); + } else { + yearNumber = buildNewNum(year, 0, secretType); + } + yearNumber.setGlobalSerial(yearNumber.getGlobalSerial() + 1); + // 更新年度流水号 + saveNum(rs, yearNumber); + + AcceptanceNumber monthNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = ? FOR UPDATE", secretType, year, currentMonth); + if (rs.next()) { + monthNumber = getSelectNum(rs); + } else { + monthNumber = buildNewNum(year, currentMonth, secretType); + } + monthNumber.setMonthlySerial(monthNumber.getMonthlySerial() + 1); + // 更新月度、流水号 + saveNum(rs, monthNumber); + + // 生成编号 + String formattedYear = String.format("%04d", year); + String formattedMonth = String.format("%02d", monthNumber.getMonth()); + String formattedMonthlySerial = String.format("%02d", monthNumber.getMonthlySerial()); + String formattedGlobalSerial = String.format("%03d", yearNumber.getGlobalSerial()); + + String num = formattedYear + formattedMonth + formattedMonthlySerial + formattedGlobalSerial; + rs.writeLog("requestId===" + requestId + ",secretType===" + secretType + ",num===" + num); + rs.commit(); + return num; + } catch (Exception e) { + rs.rollback(); + rs.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage()); + } + } + + public synchronized String getWarIndustryAcceptanceNumber(Map param) { + RecordSetTrans rs = new RecordSetTrans(); + rs.setAutoCommit(false); + try { + Integer secretType = Convert.toInt(param.get("secretType")); + String requestId = Util.null2String(param.get("requestId")); + + LocalDate now = LocalDate.now(); + int year = now.getYear(); + + + AcceptanceNumber yearNumber; + rs.executeQuery("select * from uf_sldh where secret_type= ? and year = ? and month = 0 FOR UPDATE", secretType, year); + if (rs.next()) { + yearNumber = getSelectNum(rs); + } else { + yearNumber = buildNewNum(year, 0, secretType); + } + yearNumber.setGlobalSerial(yearNumber.getGlobalSerial() + 1); + // 更新年度流水号 + saveNum(rs, yearNumber); + + // 生成编号 + String formattedYear = String.format("%04d", year); + String formattedGlobalSerial = String.format("%03d", yearNumber.getGlobalSerial()); + + String num = "JS" + formattedYear + formattedGlobalSerial; + rs.writeLog("requestId===" + requestId + ",secretType===" + secretType + ",num===" + num); + rs.commit(); + return num; + } catch (Exception e) { + rs.rollback(); + rs.writeLog(e); + throw new CustomizeRunTimeException(e.getMessage()); + } + } + + /** + * 构建查询对象 + * + * @param rs + * @return + */ + private AcceptanceNumber getSelectNum(RecordSetTrans rs) { + return AcceptanceNumber.builder() + .id(rs.getInt("id")) + .year(rs.getInt("year")) + .month(rs.getInt("month")) + .monthlySerial(rs.getInt("monthly_serial")) + .globalSerial(rs.getInt("global_serial")) + .secretType(rs.getInt("secret_type")) + .build(); + } + + /** + * 构建新对象 + * + * @param year + * @param currentMonth + * @param secretType + * @return + */ + private AcceptanceNumber buildNewNum(Integer year, Integer currentMonth, Integer secretType) { + return AcceptanceNumber.builder() + .year(year) + .month(currentMonth) + .monthlySerial(0) + .globalSerial(0) + .secretType(secretType) + .build(); + } + + /** + * 保存编号数据 + * + * @param rs + * @param number + * @throws Exception + */ + private void saveNum(RecordSetTrans rs, AcceptanceNumber number) throws Exception { + if (null == number.getId()) { + Map insertMap = buildSaveMap(number); + String uuid = UUID.randomUUID().toString(); + insertMap.put("modeuuid", uuid); + int formModeId = ModeUtil.getModeIdByTableName(TABLE_NAME); + insertMap.put("formmodeid", formModeId); + ModeUtil.buildModeInsertFields(insertMap, 1); + ModeUtil.insertData(rs, insertMap, TABLE_NAME); + ModeUtil.refreshRight(uuid, TABLE_NAME, formModeId, 1); + } else { + Map updateMap = buildSaveMap(number); + ModeUtil.buildModeUpdateFields(updateMap, 1); + ModeUtil.updateDataById(rs, updateMap, TABLE_NAME); + } + + } + + /** + * 构建数据库映射关系 + * + * @param number + * @return + */ + private IgnoreCaseHashMap buildSaveMap(AcceptanceNumber number) { + IgnoreCaseHashMap dataMap = new IgnoreCaseHashMap<>(); + if (null != number.getId()) { + dataMap.put("id", number.getId()); + } + dataMap.put("year", number.getYear()); + dataMap.put("month", number.getMonth()); + dataMap.put("monthly_serial", number.getMonthlySerial()); + dataMap.put("global_serial", number.getGlobalSerial()); + dataMap.put("secret_type", number.getSecretType()); + return dataMap; + } +} diff --git a/src/com/engine/secret/service/AutoGenerateNumberService.java b/src/com/engine/secret/service/AutoGenerateNumberService.java new file mode 100644 index 0000000..21c6310 --- /dev/null +++ b/src/com/engine/secret/service/AutoGenerateNumberService.java @@ -0,0 +1,18 @@ +package com.engine.secret.service; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public interface AutoGenerateNumberService { + /** + * 获取受理单号 + * + * @param param + * @return + */ + String getAcceptanceNumber(Map param) ; +} diff --git a/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java b/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java new file mode 100644 index 0000000..582acfb --- /dev/null +++ b/src/com/engine/secret/service/impl/AutoGenerateNumberServiceImpl.java @@ -0,0 +1,33 @@ +package com.engine.secret.service.impl; + +import cn.hutool.core.convert.Convert; +import com.engine.core.impl.Service; +import com.engine.secret.exception.CustomizeRunTimeException; +import com.engine.secret.instance.AutoGenerateNumberInstance; +import com.engine.secret.service.AutoGenerateNumberService; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberServiceImpl extends Service implements AutoGenerateNumberService { + + @Override + public String getAcceptanceNumber(Map param) { + Integer secretType = Convert.toInt(param.get("secretType")); + if (null == secretType) { + throw new CustomizeRunTimeException("未获取到[保密资质(资格)类型],请检查表单数据"); + } + AutoGenerateNumberInstance instance = AutoGenerateNumberInstance.getInstance(); + if (0 == secretType || 1 == secretType) { + // 集成、印制 + return instance.getAcceptanceNumber(param); + } else { + // 军工 + return instance.getWarIndustryAcceptanceNumber(param); + } + } +} diff --git a/src/com/engine/secret/util/ModeUtil.java b/src/com/engine/secret/util/ModeUtil.java index 8bd2d47..d9491d4 100644 --- a/src/com/engine/secret/util/ModeUtil.java +++ b/src/com/engine/secret/util/ModeUtil.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; import weaver.common.DateUtil; import weaver.conn.RecordSet; +import weaver.conn.RecordSetTrans; import weaver.docs.docs.*; import weaver.file.ImageFileManager; import weaver.formmode.IgnoreCaseHashMap; @@ -179,6 +180,25 @@ public class ModeUtil { } } + public static void insertData(RecordSetTrans rs,Map dataMap, String tableName) throws Exception { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + List paramList = new ArrayList<>(); + + dataMap.forEach((key, value) -> { + if (null != value) { + String valueStr = String.valueOf(value); + if (StringUtils.isNotBlank(valueStr)) { + fieldList.add(key); + dataList.add(valueStr); + paramList.add("?"); + } + } + }); + String insertSql = " insert into " + tableName + "(" + StringUtils.join(fieldList, ",") + ") values (" + StringUtils.join(paramList, ",") + ")"; + rs.executeUpdate(insertSql, dataList); + } + /** * 根据ID更新数据 * @@ -204,6 +224,27 @@ public class ModeUtil { } } + /** + * 根据ID更新数据 + * + * @param dataMap + * @param tableName + */ + public static void updateDataById(RecordSetTrans rs,Map dataMap, String tableName) throws Exception { + List fieldList = new ArrayList<>(); + List dataList = new ArrayList<>(); + String id = Util.null2String(dataMap.get("id")); + dataMap.remove("id"); + + dataMap.forEach((key, value) -> { + fieldList.add(key + " = ? "); + dataList.add(value); + }); + dataList.add(id); + String updateSql = "update " + tableName + " set " + StringUtils.join(fieldList, ",") + " where id = ? "; + rs.executeUpdate(updateSql, dataList); + } + /** * 更新数据 * diff --git a/src/com/engine/secret/web/AutoGenerateNumberController.java b/src/com/engine/secret/web/AutoGenerateNumberController.java new file mode 100644 index 0000000..66d5c36 --- /dev/null +++ b/src/com/engine/secret/web/AutoGenerateNumberController.java @@ -0,0 +1,38 @@ +package com.engine.secret.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.secret.service.AutoGenerateNumberService; +import com.engine.secret.service.impl.AutoGenerateNumberServiceImpl; +import com.engine.secret.util.ResponseResult; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/04/16 + * @version: 1.0 + */ +public class AutoGenerateNumberController { + public AutoGenerateNumberService getService(User user) { + return ServiceUtil.getService(AutoGenerateNumberServiceImpl.class, user); + } + + @GET + @Path("/getAcceptanceNumber") + @Produces(MediaType.APPLICATION_JSON) + public String getAcceptanceNumber(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + Map param = ParamUtil.request2Map(request); + return new ResponseResult, String>(user).run(getService(user)::getAcceptanceNumber, param); + } +}