From abefef70ee144169527e878513636578742f40bc Mon Sep 17 00:00:00 2001
From: chengf <cgf12138@163.com>
Date: 星期四, 29 一月 2026 09:34:51 +0800
Subject: [PATCH] 上词掉词逻辑更新-cgf

---
 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ContractController.java |  265 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 247 insertions(+), 18 deletions(-)

diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ContractController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ContractController.java
index 5068e35..0a7b7c7 100644
--- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ContractController.java
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ContractController.java
@@ -6,11 +6,18 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+import cn.hutool.extra.pinyin.PinyinUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import jakarta.websocket.server.PathParam;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
 import org.jeecg.common.aspect.DictAspect;
 import org.jeecg.modules.demo.customer.entity.Customer;
 import org.jeecg.modules.demo.customer.service.ICustomerService;
@@ -37,6 +44,8 @@
 import org.jeecg.modules.demo.contract.service.ISemanticWordService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.multipart.MultipartFile;
@@ -99,7 +108,7 @@
         }
         // 鑷畾涔夊閫夌殑鏌ヨ瑙勫垯涓猴細LIKE_WITH_OR
         customeRuleMap.put("reviewStatus", QueryRuleEnum.LIKE_WITH_OR);
-        QueryWrapper<Contract> queryWrapper = QueryGenerator.initQueryWrapper(contract, req.getParameterMap(),customeRuleMap);
+        QueryWrapper<Contract> queryWrapper = QueryGenerator.initQueryWrapper(contract, req.getParameterMap(),customeRuleMap,true);
         if (contract.getAgentAuditorIsNull() != null) {
             if (contract.getAgentAuditorIsNull().equals("false")) {
                 queryWrapper.isNotNull("agents_name");
@@ -122,14 +131,42 @@
                 name.add(sysUser.getUsername());
             }
             name.add(user);
-            queryWrapper.in("create_by", name);
-            queryWrapper.ne("review_status", "8");
+            queryWrapper.nested(wrapper -> {
+                // 鍐呭眰绗竴涓潯浠讹細(create_by IN (name) AND review_status != 2)
+                wrapper.nested(w1 -> w1.in("create_by", name).ne("review_status", 2));
+                // 鍐呭眰 OR 鏉′欢锛�(create_by = 鏈�鍚庝竴涓猲ame AND review_status = 2)
+                wrapper.or(w2 -> w2.eq("create_by", name.get(name.size()-1)).eq("review_status", 2));
+            });
         }
-        else if (role.equals("1972228688033452034")){//璐㈠姟
+        if (role.equals("1972228688033452034")){//璐㈠姟
             queryWrapper.ne("review_status", "8");
         }
 		Page<Contract> page = new Page<Contract>(pageNo, pageSize);
-		IPage<Contract> pageList = contractService.page(page, queryWrapper);
+        queryWrapper.orderBy(
+                true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                "CASE WHEN review_status = 1 THEN 1 ELSE 0 END" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+        );
+
+        queryWrapper.orderBy(
+                true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                "CASE WHEN review_status = 2 THEN 1 ELSE 0 END" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+        );
+
+        queryWrapper.orderBy(
+                true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                true, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                "emergency_status" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+        );
+
+        queryWrapper.orderBy(
+                true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                "create_time" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+        );
+
+        IPage<Contract> pageList = contractService.page(page, queryWrapper);
         List<SemanticWord> semanticWordList = null;
         for (Contract contract1 : pageList.getRecords()){
             semanticWordList = semanticWordService.selectByMainId(contract1.getId());
@@ -145,8 +182,83 @@
         }
 		return Result.OK(pageList);
 	}
-	
-	/**
+
+
+     @Operation(summary="鍚堝悓-鏌ヨ璇ヨ鑹插悎鍚屼釜鏁�")
+     @GetMapping(value = "/count")
+     public Result<IPage<Contract>> queryPageList(Contract contract,
+                                                  @RequestParam(name="role", defaultValue="鏃�") String role,
+                                                  @RequestParam(name="user", defaultValue="鏃�") String user,
+                                                  HttpServletRequest req) {
+         // 鑷畾涔夋煡璇㈣鍒�
+         Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
+         if (contract.getCreateBy() != null) {
+             user = contract.getCreateBy();
+         }
+         // 鑷畾涔夊閫夌殑鏌ヨ瑙勫垯涓猴細LIKE_WITH_OR
+         customeRuleMap.put("reviewStatus", QueryRuleEnum.LIKE_WITH_OR);
+         QueryWrapper<Contract> queryWrapper = QueryGenerator.initQueryWrapper(contract, req.getParameterMap(),customeRuleMap,true);
+         if (contract.getAgentAuditorIsNull() != null) {
+             if (contract.getAgentAuditorIsNull().equals("false")) {
+                 queryWrapper.isNotNull("agents_name");
+             } else{
+                 queryWrapper.and(wrapper -> wrapper.isNull("agents_name").or().eq("agents_name", ""));
+
+             }
+         }
+         if (user.equals("鏃�"));
+         else if (role.equals("1972228581703651330")){//閿�鍞�
+//        else{
+//            if (user.equals("鏃�")){
+//                return Result.error("璇疯緭鍏ラ攢鍞悕绉�");//閿�鍞牴鎹敤鎴风瓫閫�
+//            }
+             QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+             sysUserQueryWrapper.eq("agent_sales", user);
+             Result<IPage<SysUser>> iPageResult = sysUserService.queryPageList(req, sysUserQueryWrapper, 100, 1);
+             List<String> name = new ArrayList<>();
+             for (SysUser sysUser : iPageResult.getResult().getRecords()){
+                 name.add(sysUser.getUsername());
+             }
+             name.add(user);
+             queryWrapper.nested(wrapper -> {
+                 // 鍐呭眰绗竴涓潯浠讹細(create_by IN (name) AND review_status != 2)
+                 wrapper.nested(w1 -> w1.in("create_by", name).ne("review_status", 2));
+                 // 鍐呭眰 OR 鏉′欢锛�(create_by = 鏈�鍚庝竴涓猲ame AND review_status = 2)
+                 wrapper.or(w2 -> w2.eq("create_by", name.get(name.size()-1)).eq("review_status", 2));
+             });
+         }
+         if (role.equals("1972228688033452034")){//璐㈠姟
+             queryWrapper.ne("review_status", "8");
+         }
+         queryWrapper.orderBy(
+                 true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                 false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                 "CASE WHEN review_status = 1 THEN 1 ELSE 0 END" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+         );
+
+         queryWrapper.orderBy(
+                 true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                 false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                 "CASE WHEN review_status = 2 THEN 1 ELSE 0 END" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+         );
+
+         queryWrapper.orderBy(
+                 true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                 true, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                 "emergency_status" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+         );
+
+         queryWrapper.orderBy(
+                 true,  // condition锛氭槸鍚﹀惎鐢ㄨ鎺掑簭锛坱rue=鍚敤锛�
+                 false, // isAsc锛氭槸鍚﹀崌搴忥紙false=闄嶅簭锛岃 1 鍦ㄥ墠銆�0 鍦ㄥ悗锛�
+                 "create_time" // R column锛氳櫄鎷熸帓搴忓垪锛堢洿鎺ヤ紶 SQL 鐗囨锛�
+         );
+
+         long count = contractService.count(queryWrapper);
+         return Result.OK(count+"");
+     }
+
+     /**
 	 *   娣诲姞
 	 *
 	 * @param contractPage
@@ -159,10 +271,47 @@
 	public Result<String> add(@RequestBody ContractPage contractPage) {
 		Contract contract = new Contract();
 		BeanUtils.copyProperties(contractPage, contract);
+        contract.setContractCode(getFirstLetter(contract.getContractName()));
 		contractService.saveMain(contract, contractPage.getContractFileList(),contractPage.getSemanticWordList());
-		return Result.OK("娣诲姞鎴愬姛锛�");
+        addContract(contract,contractPage.getSemanticWordList());
+
+
+
+        return Result.OK("娣诲姞鎴愬姛锛�");
 	}
-	
+
+     public static String getFirstLetter(String chinese) {
+         if (chinese == null || chinese.isEmpty()) {
+             return "";
+         }
+
+         HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
+         format.setCaseType(HanyuPinyinCaseType.UPPERCASE); // 澶у啓
+         format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 蹇界暐澹拌皟
+
+         StringBuilder firstLetters = new StringBuilder();
+         char[] chars = chinese.toCharArray();
+
+         for (char c : chars) {
+             // 濡傛灉鏄腑鏂囷紝鎻愬彇棣栧瓧姣�
+             if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
+                 try {
+                     String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
+                     if (pinyinArray != null && pinyinArray.length > 0) {
+                         firstLetters.append(pinyinArray[0].charAt(0)); // 鍙栫涓�涓嫾闊崇殑棣栧瓧姣�
+                     }
+                 } catch (BadHanyuPinyinOutputFormatCombination e) {
+                     e.printStackTrace();
+                 }
+             } else {
+                 // 闈炰腑鏂囦笉澶勭悊锛堟垨鏍规嵁闇�姹備繚鐣�/杩囨护锛�
+                 // firstLetters.append(c); // 濡傞渶淇濈暀闈炰腑鏂囧瓧绗︼紝瑙e紑姝ゆ敞閲�
+             }
+         }
+
+         return firstLetters.toString();
+     }
+
 	/**
 	 *  缂栬緫
 	 *
@@ -209,6 +358,13 @@
 		}
 		contractService.updateMain(contract, contractPage.getContractFileList(),contractPage.getSemanticWordList());
         customerService.updateById(contractEntity.getCustomer());
+
+        if (contractPage.getStatus() != null) {
+            UpdateWrapper<SemanticWord> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.set("status", contractPage.getStatus()); // 鏇挎崲涓哄疄闄呰淇敼鐨勫瓧娈靛悕锛堝semantic_id锛�
+            updateWrapper.eq("contract_id", contract.getId()); // 澶嶇敤鏌ヨ鏉′欢
+            boolean update = semanticWordService.update(updateWrapper);
+        }
 		return Result.OK("缂栬緫鎴愬姛!");
 	}
 	
@@ -223,7 +379,28 @@
     @RequiresPermissions("contract:contract:delete")
 	@DeleteMapping(value = "/delete")
 	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		contractService.delMain(id);
+        QueryWrapper<Contract> objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.eq("id",id);
+
+        List<Contract> list = contractService.list(objectQueryWrapper);
+        String customerName = list.get(0).getCustomerName();
+        contractService.delMain(id);
+
+        objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.eq("customer_name",customerName);
+
+        if (contractService.count(objectQueryWrapper) == 0) {
+            QueryWrapper<Customer> customerQueryWrapper = new QueryWrapper<>();
+            customerQueryWrapper.eq("enterprise_name",customerName);
+            Customer one = customerService.getOne(customerQueryWrapper);
+            customerService.removeById(one);
+
+            QueryWrapper<SysUser> qw = new QueryWrapper<>();
+            qw.eq("username", customerName);
+            qw.eq("realname", customerName);
+
+            sysUserService.remove(qw);
+        }
 		return Result.OK("鍒犻櫎鎴愬姛!");
 	}
 	
@@ -404,16 +581,16 @@
              // 璁$畻鏃ユ湡鑼冨洿
              java.time.LocalDate today = java.time.LocalDate.now();
              java.util.Date startDate = java.sql.Date.valueOf(today);
-             java.util.Date endDateLimit = java.sql.Date.valueOf(today.plusDays(days));
+             java.util.Date endDateLimit = java.sql.Date.valueOf(today.minusDays(days));
 
              // 鏋勫缓鏌ヨ鏉′欢
              QueryWrapper<Contract> queryWrapper = new QueryWrapper<>();
-             queryWrapper.ge("end_date", startDate);  // end_date >= 浠婂ぉ
-             queryWrapper.le("end_date", endDateLimit);  // end_date <= 浠婂ぉ+鎸囧畾澶╂暟
-
-             // 鎸夌粨鏉熸棩鏈熷崌搴忔帓鍒楋紝鍗冲皢杩囨湡鐨勬帓鍓嶉潰
-             queryWrapper.orderByAsc("end_date");
-
+             queryWrapper.isNotNull("month")
+                     // 鏇挎崲涓� MySQL 姝g‘鐨� DATE_ADD 璇硶锛欴ATE_ADD(鏃ユ湡, INTERVAL 鏁板�� 鍗曚綅)
+                     .apply("DATE_ADD(create_time, INTERVAL month MONTH) >= {0}", endDateLimit)
+                     .apply("DATE_ADD(create_time, INTERVAL month MONTH) <= {0}", startDate)
+                     // 鎺掑簭涔熷悓姝ユ浛鎹负 MySQL 璇硶
+                     .orderByAsc("DATE_ADD(create_time, INTERVAL month MONTH)");
              // 鎵ц鏌ヨ
              List<Contract> contractList = contractService.list(queryWrapper);
 
@@ -468,6 +645,55 @@
              return Result.error("鏌ヨ澶辫触: " + e.getMessage());
          }
      }
+
+     @Autowired
+     @Qualifier("robinJdbcTemplate") // 鎸囧畾鐗瑰畾鐨凧dbcTemplate
+     private JdbcTemplate jdbcTemplate;
+
+     public void addContract(Contract contract, List<SemanticWord> semanticWordList) {
+         for (SemanticWord semanticWord : semanticWordList){
+             String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+             String sBookMarkName = PinyinUtil.getPinyin(contract.getContractName(), "") + "_" + PinyinUtil.getPinyin(semanticWord.getOutWord());
+             String sCreator = contract.getCreateBy();
+             String sType = contract.getAgentsName() == null || contract.getAgentsName().equals("") ? "瀹㈡埛" : "浠g悊鍟�";
+             String sTarget = semanticWord.getOutWord();
+             String checkSql = "SELECT COUNT(1) FROM d_Contract WHERE sBookMarkName = ?";
+             String contractId = PinyinUtil.getPinyin(contract.getContractName(), "");
+             Integer count = jdbcTemplate.queryForObject(
+                     checkSql,
+                     new Object[]{sBookMarkName},  // 浼犲叆鏌ヨ鍙傛暟锛堝悎鍚屽悕绉帮級
+                     Integer.class
+             );
+            if (count > 0) {
+                return;
+            }
+             String[] arr = new  String[]{"鍝濂�", "鍝闈犺氨", "鎺掕姒�", "閫夊摢瀹�", "鎺掑悕"};
+             for (int i = 0; i < 5; i++) {
+                 uuid = UUID.randomUUID().toString().replaceAll("-", "");
+                 sBookMarkName = semanticWord.getWord() + arr[i];
+                 String semantic_word = semanticWord.getOutWord();
+// 鎻掑叆SQL锛屽浐瀹氬�肩洿鎺ュ啓鍦⊿QL涓紝鍔ㄦ�佸�肩敤?鍗犱綅
+                 String insertSql = "INSERT INTO d_keyword_list (" +  // 琛ㄥ悕淇涓� d_keyword_list
+                         "UUID, sBookMarkName, ContractId, semantic_word, sCreator, sType, sDomain, " +
+                         "apply_name, is_active, priority_num, interval_minute, is_proxy, proxy_mode, scan_min" +  // 琛ュ厖琛ㄤ腑瀛樺湪鐨� is_proxy 瀛楁
+                         ") VALUES (" +
+                         "?, ?, ?, ?, 'admin', 'manual', '瀹㈡埛', " +
+                         "'deepseek', 1, 8, 240, 0, 'random', 5" +  // 琛ュ厖 is_proxy 鐨勯粯璁ゅ�硷紙int绫诲瀷锛岃繖閲岀敤0锛�
+                         ")";
+
+                 // 鎵ц鎻掑叆锛屼粎浼犲叆鍔ㄦ�佸弬鏁�
+//                 jdbcTemplate.update(
+//                         insertSql,
+//                         uuid,               // 鍔ㄦ�乁UID
+//                         sBookMarkName, // 鍔ㄦ�乻BookMarkName
+//                         contractId,
+//                         semanticWord.getWord()  // 鍔ㄦ�乻emantic_word
+//                 );
+
+             }
+         }
+     }
+
      @RequiresPermissions("contract:contract:importAgentContractWord")
      @RequestMapping(value = "/importAgentContractWord", method = RequestMethod.POST)
      public Result<String> importAgentContractWord(@RequestBody Contract contract) {
@@ -501,6 +727,7 @@
              contractFile.setContractId(one1.getId());
              contractFileService.save(contractFile);
          }
+         addContract(contract,contract.getSemanticWordObjs());
 
          return Result.OK("娣诲姞鎴愬姛锛�");
      }
@@ -536,7 +763,9 @@
              if (phone != null && phone.matches("\\d{1,20}")) {
                  // 鏍¢獙閫氳繃锛屾斁鍏SONObject
                  jsonObject.put("phone", phone);
-             } else {
+             } else if(phone == null) {
+
+             }else {
                  return Result.error("璇疯緭鍏ユ纭殑鐢佃瘽鍙风爜");
              }
              jsonObject.put("email" , customer.getCustomerEmail());

--
Gitblit v1.8.0