chengf
2026-02-07 e310dfdc93c20ac0c3b5fcd1a95de298cfce2ae9
添加状态:停止服务-cgf
6个文件已修改
124 ■■■■■ 已修改文件
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ExcelImportController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/copywriting/controller/CopywritingController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/copywriting/entity/Copywriting.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-start/src/main/resources/application-docker.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-start/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/contract/controller/ExcelImportController.java
@@ -1,13 +1,18 @@
package org.jeecg.modules.demo.contract.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.undertow.util.Headers;
import jakarta.servlet.http.HttpServletRequest;
import kong.unirest.Unirest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.demo.contract.entity.Contract;
@@ -16,6 +21,8 @@
import org.jeecg.modules.demo.contract.service.IContractService;
import org.jeecg.modules.demo.contract.service.ISemanticWordService;
import org.jeecg.modules.demo.copywriting.controller.CopywritingAsyncService;
import org.jeecg.modules.demo.copywriting.entity.Copywriting;
import org.jeecg.modules.demo.copywriting.service.ICopywritingService;
import org.jeecg.modules.listener.ExcelDataListener;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
@@ -26,8 +33,12 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.http.HttpResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 适配新Excel列的导入接口控制器
@@ -43,6 +54,8 @@
    private ISemanticWordService semanticWordService;
    @Autowired
    private IContractService contractService;
    @Autowired
    public ICopywritingService copywritingService;
    /**
     * Excel文件导入接口(适配大类、品牌等五列)
     * @return 导入结果
@@ -152,5 +165,83 @@
            return Result.OK("开始生成,任务已提交至后台处理");
        }
    }
    public static String getRandomElementFromArray(String[] strArray) {
        // 1. 校验数组合法性:空数组/Null直接返回null,避免异常
        if (strArray == null || strArray.length == 0) {
            return null;
        }
        // 2. 创建随机数生成器,生成0到数组长度-1的随机索引
        Random random = new Random();
        int randomIndex = random.nextInt(strArray.length);
        // 3. 根据随机索引返回对应元素
        return strArray[randomIndex];
    }
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    /**
     * 方法1:返回当前时间的完整格式化字符串(yyyy-MM-dd HH:mm:ss)
     * @return 格式化后的时间字符串,如:2026-02-06 20:15:30
     */
    public static String getCurrentTimeStr() {
        return LocalDateTime.now().format(DEFAULT_FORMATTER);
    }
    @RequiresPermissions("contract:contract:batchPublish")
    @PostMapping("/batchPublish")
    public Result<String> batchPublish(@RequestParam("contractId") String contractId) {
        if (contractId.isEmpty()) {
            return Result.error("合同编号不能为空!");
        }
        String[] arr = new String[]{"14457","28879","20838"};
        QueryWrapper<Copywriting> wrapper = new QueryWrapper<>();
// 手动拼接 LEFT JOIN 和筛选条件
        wrapper.select("copywriting.*")
                .inSql("word_id",  // 使用正确的关联字段 word_id
                        "SELECT id FROM semantic_word WHERE contract_id = '" + contractId + "'");
        wrapper.isNull("order_nid");
        wrapper.eq("status",3);
        List<Copywriting> copywritingList = copywritingService.list(wrapper);
        if (copywritingList.isEmpty()) {
            return Result.error("该合同不存在状态为审核可发稿的文案");
        }
        for (Copywriting copywriting : copywritingList) {
            kong.unirest.HttpResponse<String> response = Unirest.post("http://8.138.187.158:8082/api/media/send")
                    .field("api_key", "sk_4c8f6a970de896e232909e2959254441")
                    .field("resource_id", getRandomElementFromArray(arr))
                    .field("title", copywriting.getTitle())
                    .field("content", copywriting.getText())
                    .field("remark", getCurrentTimeStr())
                    .field("third_id", copywriting.getCreateBy())
                    .asString();
            // 1. 校验响应状态和响应体非空
            if (response != null && response.getStatus() == 200 && StringUtils.isNotBlank(response.getBody())) {
                // 2. 解析JSON响应体
                JSONObject responseJson = JSON.parseObject(response.getBody());
                // 3. 校验code是否为1(投稿成功),再提取order_nid
                if (responseJson.getInteger("code") == 1) {
                    JSONObject dataObj = responseJson.getJSONObject("data");
                    if (dataObj != null && dataObj.containsKey("order_nid")) {
                        // 获取order_nid(转为String,适配Copywriting的orderNid字段类型)
                        String orderNid = dataObj.get("order_nid").toString();
                        // 4. 赋值并更新数据库
                        copywriting.setOrderNid(orderNid);
                        copywriting.setStatus("4");
                        copywritingService.updateById(copywriting);
                    } else {
                        // 日志记录:响应体无data或order_nid字段
                        System.err.println("投稿成功但未获取到order_nid,响应体:" + response.getBody());
                    }
                } else {
                    // 日志记录:接口返回非成功状态
                    System.err.println("投稿失败,响应体:" + response.getBody());
                }
            }
        }
        return Result.ok("批量投稿成功!");
    }
}
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/copywriting/controller/CopywritingController.java
@@ -104,9 +104,20 @@
        }
        if (StringUtils.isNotBlank(copywriting.getWordLike())){
            queryWrapper.exists("SELECT 1 FROM semantic_word WHERE semantic_word.id = copywriting.word_id " +
                            "AND semantic_word.word LIKE '%" + copywriting.getWordLike() + "%'");
                    "AND semantic_word.word LIKE '%" + copywriting.getWordLike() + "%'");
        }
        if (StringUtils.isNotBlank(copywriting.getContractId())) {
            // 1. 拼接关联 contact 表的 EXISTS 子查询,使用 contact.id 作为外键关联
            // 2. 使用 MyBatis-Plus 的参数占位符避免 SQL 注入,而不是直接字符串拼接
            String existsSql = "SELECT 1 FROM semantic_word " +
                    "LEFT JOIN contract ON semantic_word.contract_id = contract.id " + // 关联 contact 表(外键关联)
                    "WHERE semantic_word.id = copywriting.word_id " +
                    "AND contract.id = " + copywriting.getContractId(); // 使用 contact 表的 id 作为条件
            // 给 QueryWrapper 设置参数,避免 SQL 注入
            queryWrapper.exists(existsSql);
        }
        Page<Copywriting> page = new Page<Copywriting>(pageNo, pageSize);
        IPage<Copywriting> pageList = copywritingService.page(page, queryWrapper);
        for (Copywriting item : pageList.getRecords()) {
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/demo/copywriting/entity/Copywriting.java
@@ -96,6 +96,10 @@
    @Dict(dicCode = "fb_status")
    @Schema(description = "发布状态")
    private java.lang.String outStatus;
    @Excel(name = "订单编号", width = 15)
    @Schema(description = "订单编号")
    private java.lang.String orderNid;
    /**发布时间*/
    @Excel(name = "发布时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@@ -111,4 +115,8 @@
    @TableField(exist = false)
    private String wordLike;
    @TableField(exist = false)
    private String contractId;
}
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
@@ -178,7 +178,7 @@
  data:
    redis:
      database: 0
      host: 172.19.0.1
      host: 47.92.103.110
      port: 6379
      password: 'win2020!'
#mybatis plus 设置
jeecg-module-system/jeecg-system-start/src/main/resources/application-docker.yml
@@ -161,9 +161,9 @@
          slow-sql-millis: 5000
      datasource:
        master:
          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          url: jdbc:mysql://172.28.46.15:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          username: root
          password: root
          password: win2020!
          driver-class-name: com.mysql.cj.jdbc.Driver
          # 多数据源配置
          #multi-datasource1:
@@ -175,9 +175,9 @@
  data:
    redis:
      database: 0
      host: 127.0.0.1
      host: 172.28.46.15
      port: 6379
      password:
      password: 'win2020!'
#mybatis plus 设置
mybatis-plus:
  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml
jeecg-module-system/jeecg-system-start/src/main/resources/application.yml
@@ -2,7 +2,7 @@
  application:
    name: jeecg-system
  profiles:
    active: 'dev'
    active: 'docker'
robinsql:
  url: jdbc:mysql://114.215.124.206:3306/geo?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai