| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | } |
| | | // 自定义多选的查询规则为: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"); |
| | |
| | | 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:是否启用该排序(true=启用) |
| | | false, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "CASE WHEN review_status = 1 THEN 1 ELSE 0 END" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | false, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "CASE WHEN review_status = 2 THEN 1 ELSE 0 END" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | true, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "emergency_status" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | 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()); |
| | |
| | | } |
| | | 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("无")){ |
| | | QueryWrapper qw = new QueryWrapper<SysUser>(); |
| | | qw.eq("id", user); |
| | | String userName = ((SysUser)((Page) sysUserService.queryPageList(req, qw, 1, 1).getResult()).getRecords().get(0)).getUsername(); |
| | | queryWrapper.eq("create_by", userName); |
| | | } |
| | | if (role.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 = 最后一个name AND review_status = 2) |
| | | wrapper.or(w2 -> w2.eq("create_by", name.get(name.size()-1)).eq("review_status", 2)); |
| | | }); |
| | | } |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | false, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "CASE WHEN review_status = 1 THEN 1 ELSE 0 END" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | false, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "CASE WHEN review_status = 2 THEN 1 ELSE 0 END" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | true, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "emergency_status" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | queryWrapper.orderBy( |
| | | true, // condition:是否启用该排序(true=启用) |
| | | false, // isAsc:是否升序(false=降序,让 1 在前、0 在后) |
| | | "create_time" // R column:虚拟排序列(直接传 SQL 片段) |
| | | ); |
| | | |
| | | long count = contractService.count(queryWrapper); |
| | | return Result.OK(count+""); |
| | | } |
| | | |
| | | /** |
| | | * 添加 |
| | | * |
| | | * @param contractPage |
| | |
| | | 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); // 如需保留非中文字符,解开此注释 |
| | | } |
| | | } |
| | | |
| | | return firstLetters.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 编辑 |
| | | * |
| | |
| | | } |
| | | 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("编辑成功!"); |
| | | } |
| | | |
| | | |
| | | @AutoLog(value = "停止服务合同") |
| | | @Operation(summary="停止服务合同") |
| | | @RequiresPermissions("contract:contract:dropService") |
| | | @RequestMapping(value = "/dropService", method = {RequestMethod.PUT,RequestMethod.POST}) |
| | | public Result<String> dropService(@RequestBody ContractPage contractPage) { |
| | | Contract contract = new Contract(); |
| | | contract.setId(contractPage.getId()); |
| | | contract.setIsDropService(contractPage.getIsDropService().isEmpty() ? "是" : contractPage.getIsDropService()); |
| | | boolean b = contractService.updateById(contract); |
| | | if (b) { |
| | | return Result.OK("更新完成"); |
| | | } else { |
| | | return Result.error("更新失败"); |
| | | } |
| | | } |
| | | /** |
| | | * 通过id删除 |
| | | * |
| | |
| | | // 计算日期范围 |
| | | 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 正确的 DATE_ADD 语法:DATE_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); |
| | | |
| | |
| | | return Result.error("查询失败: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | @Autowired |
| | | @Qualifier("robinJdbcTemplate") // 指定特定的JdbcTemplate |
| | | 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("") ? "客户" : "代理商"; |
| | | 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,固定值直接写在SQL中,动态值用?占位 |
| | | 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, // 动态UUID |
| | | // sBookMarkName, // 动态sBookMarkName |
| | | // contractId, |
| | | // semanticWord.getWord() // 动态semantic_word |
| | | // ); |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | @RequiresPermissions("contract:contract:importAgentContractWord") |
| | | @RequestMapping(value = "/importAgentContractWord", method = RequestMethod.POST) |
| | | public Result<String> importAgentContractWord(@RequestBody Contract contract) { |
| | |
| | | contractFile.setContractId(one1.getId()); |
| | | contractFileService.save(contractFile); |
| | | } |
| | | // addContract(contract,contract.getSemanticWordObjs()); |
| | | |
| | | return Result.OK("添加成功!"); |
| | | } |