Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

顾方军 vor 2 Monaten
Ursprung
Commit
2b1958f52d
26 geänderte Dateien mit 733 neuen und 34 gelöschten Zeilen
  1. 40 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitItineraryDDO.java
  2. 37 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitItineraryDO.java
  3. 34 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitItineraryDVO.java
  4. 36 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitItineraryVO.java
  5. 9 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/qry/BlinkCustomerVisitItineraryQry.java
  6. 31 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitItineraryDImpl.java
  7. 262 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitItineraryImpl.java
  8. 33 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerVisitItineraryMapper.java
  9. 16 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitItineraryDRepository.java
  10. 24 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitItineraryRepository.java
  11. 12 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitItineraryDService.java
  12. 32 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitItineraryService.java
  13. 10 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerVisitItineraryRepositoryMapper.xml
  14. 12 1
      bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/api/SettingEngineController.java
  15. 30 21
      bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/demo/DemoEngineController.java
  16. 2 1
      bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/service/FlowUniversalService.java
  17. BIN
      bound-link-api/sa-flow-api/src/main/resources/lib/sa-flow-engine-3.0.0.jar
  18. 4 0
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/common/utils/StString.java
  19. 15 0
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/common/RedisKeys.java
  20. 1 0
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/mapper/StFormTemplateMapper.java
  21. 19 0
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/virentity/DataPowerDataAudit.java
  22. 17 0
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/virentity/DataPowerDataCirculate.java
  23. 23 4
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/service/data/StDataService.java
  24. 28 5
      bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/service/setting/StSettingService.java
  25. 5 1
      bound-link-api/sa-flow-common/src/main/resources/mapper/StFormTemplateMapper.xml
  26. 1 1
      bound-link-api/sa-flow-common/src/main/resources/mapper/StTaskitemMapper.xml

+ 40 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitItineraryDDO.java

@@ -0,0 +1,40 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/*客户拜访行程明细表*/
+@Data
+@TableName("blink_customer_visit_itinerary_d")
+public class BlinkCustomerVisitItineraryDDO implements Serializable {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "关联主表ID")
+    @TableField("pid")
+    private String pid;
+    @Schema(description = "到达城市")
+    @TableField("arrival_city")
+    private String arrivalCity;
+    @Schema(description = "到达日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("arrival_date")
+    private Date arrivalDate;
+    @Schema(description = "停留周期")
+    @TableField("duration")
+    private Double duration;
+    @Schema(description = "排序号")
+    @TableField("sort_no")
+    private Integer sortNo;
+
+}

+ 37 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitItineraryDO.java

@@ -0,0 +1,37 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+/*客户拜访行程*/
+@Data
+@TableName("blink_customer_visit_itinerary")
+public class BlinkCustomerVisitItineraryDO extends BaseEntity {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "行程单名称")
+    @TableField("itinerary_name")
+    private String itineraryName;
+    @Schema(description = "状态(0:失败,1:成功)")
+    @TableField("status")
+    private Integer status;
+    @Schema(description = "周期")
+    @TableField("durations")
+    private Double durations;
+    @Schema(description = "到达城市")
+    @TableField("arrival_citys")
+    private String arrivalCitys;
+    @Schema(description = "附件")
+    @TableField("attachments")
+    private String attachments;
+
+}

+ 34 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitItineraryDVO.java

@@ -0,0 +1,34 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+/*客户拜访行程明细表*/
+@Data
+public class BlinkCustomerVisitItineraryDVO implements Serializable {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "关联主表ID")
+    @TableField("pid")
+    private String pid;
+    @Schema(description = "到达城市")
+    @TableField("arrival_city")
+    private String arrivalCity;
+    @Schema(description = "到达日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("arrival_date")
+    private Date arrivalDate;
+    @Schema(description = "停留周期")
+    @TableField("duration")
+    private Double duration;
+    @Schema(description = "排序号")
+    @TableField("sort_no")
+    private Integer sortNo;
+
+}

+ 36 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitItineraryVO.java

@@ -0,0 +1,36 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/*客户拜访行程*/
+@Data
+public class BlinkCustomerVisitItineraryVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "行程单名称")
+    @TableField("itinerary_name")
+    private String itineraryName;
+    @Schema(description = "状态(0:失败,1:成功)")
+    @TableField("status")
+    private Integer status;
+    @Schema(description = "周期")
+    @TableField("durations")
+    private Double durations;
+    @Schema(description = "到达城市")
+    @TableField("arrival_citys")
+    private String arrivalCitys;
+    @Schema(description = "附件")
+    @TableField("attachments")
+    private String attachments;
+
+    @Schema(description = "明细")
+    private List<BlinkCustomerVisitItineraryDVO> visitItineraryDVOList;
+
+}

+ 9 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/qry/BlinkCustomerVisitItineraryQry.java

@@ -0,0 +1,9 @@
+package com.wx.blink.backend.domain.qry;
+
+import com.wx.blink.base.common.domain.PageParam;
+import lombok.Data;
+
+@Data
+public class BlinkCustomerVisitItineraryQry extends PageParam {
+
+}

+ 31 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitItineraryDImpl.java

@@ -0,0 +1,31 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryDVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitItineraryQry;
+import com.wx.blink.backend.objectmapper.BlinkCustomerVisitItineraryMapper;
+import com.wx.blink.backend.repository.BlinkCustomerVisitItineraryDRepository;
+import com.wx.blink.backend.repository.BlinkCustomerVisitItineraryRepository;
+import com.wx.blink.backend.service.IBlinkCustomerVisitItineraryDService;
+import com.wx.blink.backend.service.IBlinkCustomerVisitItineraryService;
+import com.wx.blink.base.common.domain.PageResult;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import com.wx.blink.base.common.util.BlinkPageUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class BlinkCustomerVisitItineraryDImpl extends ServiceImpl<BlinkCustomerVisitItineraryDRepository, BlinkCustomerVisitItineraryDDO> implements IBlinkCustomerVisitItineraryDService {
+
+
+
+}

+ 262 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitItineraryImpl.java

@@ -0,0 +1,262 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.PdfDocument;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryDVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitItineraryQry;
+import com.wx.blink.backend.objectmapper.BlinkCustomerVisitItineraryMapper;
+import com.wx.blink.backend.repository.BlinkCustomerVisitItineraryDRepository;
+import com.wx.blink.backend.repository.BlinkCustomerVisitItineraryRepository;
+import com.wx.blink.backend.service.IBlinkCustomerVisitItineraryDService;
+import com.wx.blink.backend.service.IBlinkCustomerVisitItineraryService;
+import com.wx.blink.base.common.domain.PageResult;
+import com.wx.blink.base.common.domain.RequestUser;
+import com.wx.blink.base.common.domain.ResponseDTO;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import com.wx.blink.base.common.util.BlinkPageUtil;
+import com.wx.blink.base.common.util.BlinkRequestUtil;
+import com.wx.blink.base.module.support.file.domain.vo.FileUploadVO;
+import com.wx.blink.base.module.support.file.service.FileService;
+import com.wx.blink.base.module.support.pdf.PDFCommonGenerator;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItem;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.PdfWriter;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+import org.xhtmlrenderer.pdf.ITextRenderer;
+
+
+@Service
+public class BlinkCustomerVisitItineraryImpl extends ServiceImpl<BlinkCustomerVisitItineraryRepository, BlinkCustomerVisitItineraryDO> implements IBlinkCustomerVisitItineraryService {
+
+    @Resource
+    private BlinkCustomerVisitItineraryRepository visitItineraryRepository;
+    @Resource
+    private BlinkCustomerVisitItineraryMapper visitItineraryMapper;
+    @Resource
+    private BlinkCustomerVisitItineraryDRepository visitItineraryDRepository;
+    @Resource
+    private IBlinkCustomerVisitItineraryDService visitItineraryDService;
+    @Resource
+    private FileService fileService;
+
+    @Override
+    public void addOrUpdate(BlinkCustomerVisitItineraryVO vo) {
+        BlinkCustomerVisitItineraryDO visitItineraryDO = visitItineraryMapper.customerVisitItineraryVOtoDomain(vo);
+        if (visitItineraryDO != null) {
+            String itineraryName = "";
+            String arrivalCitys = "";
+            Double durations = 0.0;
+            String attachments = "";
+            if (vo.getVisitItineraryDVOList() != null && !vo.getVisitItineraryDVOList().isEmpty()) {
+                itineraryName = vo.getVisitItineraryDVOList().get(0).getArrivalDate().toString() + "~"
+                        + vo.getVisitItineraryDVOList().get(vo.getVisitItineraryDVOList().size() - 1).getArrivalDate().toString();
+                attachments = createPdfAttachment(itineraryName,vo.getVisitItineraryDVOList());
+                int rowNum = 0;
+                for (BlinkCustomerVisitItineraryDVO visitItineraryDVO : vo.getVisitItineraryDVOList()) {
+                    rowNum++;
+                    arrivalCitys += visitItineraryDVO.getArrivalCity();
+                    if (rowNum < vo.getVisitItineraryDVOList().size()) {
+                        arrivalCitys += "、";
+                    }
+                    durations += visitItineraryDVO.getDuration();
+                }
+                visitItineraryDO.setItineraryName(itineraryName);
+                visitItineraryDO.setArrivalCitys(arrivalCitys);
+                visitItineraryDO.setDurations(durations);
+                visitItineraryDO.setAttachments(attachments);
+            }
+            //生成PDF
+
+            //有id更新,没有则新增
+            if (visitItineraryDO.getId() == null || visitItineraryDO.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(visitItineraryDO);
+                this.save(visitItineraryDO);
+                //保存明细
+                if (vo.getVisitItineraryDVOList() != null && !vo.getVisitItineraryDVOList().isEmpty()) {
+                    for (BlinkCustomerVisitItineraryDVO visitItineraryDVO : vo.getVisitItineraryDVOList()) {
+                        BlinkCustomerVisitItineraryDDO visitItineraryDDO = visitItineraryMapper.customerVisitItineraryDVOtoDomain(visitItineraryDVO);
+                        visitItineraryDDO.setPid(visitItineraryDO.getId());
+                        visitItineraryDService.save(visitItineraryDDO);
+                    }
+                }
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(visitItineraryDO);
+                this.updateById(visitItineraryDO);
+                //处理明细
+                Map<String, Object> delParam = new HashMap<>();
+                delParam.put("pid", visitItineraryDO.getId());
+                visitItineraryDService.removeByMap(delParam);
+                if (vo.getVisitItineraryDVOList() != null && !vo.getVisitItineraryDVOList().isEmpty()) {
+                    for (BlinkCustomerVisitItineraryDVO visitItineraryDVO : vo.getVisitItineraryDVOList()) {
+                        BlinkCustomerVisitItineraryDDO visitItineraryDDO = visitItineraryMapper.customerVisitItineraryDVOtoDomain(visitItineraryDVO);
+                        visitItineraryDDO.setPid(visitItineraryDO.getId());
+                        visitItineraryDService.save(visitItineraryDDO);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public PageResult<BlinkCustomerVisitItineraryVO> visitItineraryQueryPage(BlinkCustomerVisitItineraryQry qry) {
+        Page<?> page = BlinkPageUtil.convert2PageQuery(qry);
+        List<BlinkCustomerVisitItineraryVO> list = visitItineraryRepository.visitItineraryQueryPage(page);
+        PageResult<BlinkCustomerVisitItineraryVO> pageResult = BlinkPageUtil.convert2PageResult(page, list);
+        return pageResult;
+    }
+
+    /**
+     * 生成pdf
+     */
+    public String createPdfAttachment(String itineraryName, List<BlinkCustomerVisitItineraryDVO> vos) {
+        try {
+            MultipartFile file = new CommonsMultipartFile(createBlankPdfFileItem("attachments", itineraryName + ".pdf",vos));
+            RequestUser requestUser = BlinkRequestUtil.getRequestUser();
+            ResponseDTO<FileUploadVO> uploadedfile = fileService.fileUpload(file, 1, requestUser);
+            return uploadedfile.getData().getFileKey();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 创建一个空的PDF字节数组
+     *
+     * @return 包含空PDF的字节数组
+     */
+    public byte[] createEmptyPdfBytes() {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        // 创建PDF文档
+        Document document = new Document();
+        try {
+            PdfWriter.getInstance(document, outputStream);
+            document.open();
+            // 不添加任何内容,创建空白PDF
+            document.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return outputStream.toByteArray();
+    }
+
+    /**
+     * 生成PDF文件流
+     *
+     * @param vos      PDF内容文本
+     * @param fileName 自定义文件名(不含.pdf扩展名)
+     * @return 包含PDF字节数组和文件名的结果对象
+     * @throws IOException
+     */
+    public byte[] generatePdf(List<BlinkCustomerVisitItineraryDVO> vos, String fileName) throws IOException {
+        // 1. 创建HTML内容(简单包装)
+        String htmlContent = wrapContentInHtml(vos);
+
+        // 2. 生成PDF
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ITextRenderer renderer = new ITextRenderer();
+
+        try {
+            renderer.setDocumentFromString(htmlContent);
+            renderer.layout();
+            renderer.createPDF(outputStream);
+            return outputStream.toByteArray();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            outputStream.close();
+        }
+        return null;
+    }
+
+    /**
+     * 将纯文本包装为简单HTML
+     */
+    private String wrapContentInHtml(List<BlinkCustomerVisitItineraryDVO> vos) {
+        String result = "<!DOCTYPE html>" +
+                "<html>" +
+                "<head>" +
+                "<meta charset=\"UTF-8\">" +
+                "<style>" +
+                "body { font-family: SimSun; font-size: 14px; }" +
+                "h1 { color: #333; text-align: center; }" +
+                "</style>" +
+                "</head>" +
+                "<body>" +
+                "<h1>文档内容</h1>";
+        String content = "<div> 到达城市:{0}  到达日期:{1}  停留周期:{2}天 </div>";
+
+        for (BlinkCustomerVisitItineraryDVO vo : vos) {
+            result += MessageFormat.format(content, vo.getArrivalCity(), vo.getArrivalDate().toString(), vo.getDuration().toString());
+        }
+        result += "</body>" + "</html>";
+        return result;
+    }
+
+    /**
+     * 创建空白PDF的FileItem
+     *
+     * @param fieldName 表单字段名
+     * @param fileName  PDF文件名(如"blank.pdf")
+     * @return FileItem对象
+     */
+    public FileItem createBlankPdfFileItem(String fieldName, String fileName, List<BlinkCustomerVisitItineraryDVO> vos) {
+        // 1. 创建空白PDF字节数组
+        try {
+            byte[] pdfBytes = generatePdf(vos, fileName);
+            // 2. 创建DiskFileItem
+            DiskFileItem fileItem = new DiskFileItem(
+                    fieldName,                      // 表单字段名
+                    "application/pdf",               // 内容类型
+                    false,                           // 是否表单字段
+                    fileName,                        // 文件名
+                    1024,                            // 缓冲区大小
+                    new File(System.getProperty("java.io.tmpdir")) // 临时目录
+                    {
+                    }
+            );
+            // 3. 将PDF字节写入FileItem
+            try (OutputStream os = fileItem.getOutputStream()) {
+                os.write(pdfBytes);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return fileItem;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
+        File desc = new File(uploadDir + File.separator + fileName);
+
+        if (!desc.exists()) {
+            if (!desc.getParentFile().exists()) {
+                desc.getParentFile().mkdirs();
+            }
+        }
+        return desc;
+    }
+
+}

+ 33 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerVisitItineraryMapper.java

@@ -0,0 +1,33 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryDVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerVisitItineraryMapper {
+
+    /**
+     * 客户拜访计划数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerVisitItineraryDO customerVisitItineraryVOtoDomain(BlinkCustomerVisitItineraryVO vo);
+    /**
+     * 客户拜访计划明细数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerVisitItineraryDDO customerVisitItineraryDVOtoDomain(BlinkCustomerVisitItineraryDVO vo);
+
+
+
+}

+ 16 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitItineraryDRepository.java

@@ -0,0 +1,16 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerVisitItineraryDRepository extends BaseMapper<BlinkCustomerVisitItineraryDDO> {
+
+
+}

+ 24 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitItineraryRepository.java

@@ -0,0 +1,24 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerVisitItineraryRepository extends BaseMapper<BlinkCustomerVisitItineraryDO> {
+
+    /**
+     * 客户拜访行程查询
+     *
+     * @param page
+     * @return
+     */
+    List<BlinkCustomerVisitItineraryVO> visitItineraryQueryPage(Page<?> page);
+}

+ 12 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitItineraryDService.java

@@ -0,0 +1,12 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitItineraryQry;
+import com.wx.blink.base.common.domain.PageResult;
+
+
+public interface IBlinkCustomerVisitItineraryDService extends IService<BlinkCustomerVisitItineraryDDO> {
+}

+ 32 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitItineraryService.java

@@ -0,0 +1,32 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitItineraryDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitItineraryQry;
+import com.wx.blink.base.common.domain.PageResult;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerVisitItineraryService extends IService<BlinkCustomerVisitItineraryDO> {
+    /**
+     * 拜访行程新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerVisitItineraryVO vo);
+
+    /**
+     * 拜访行程查询
+     *
+     * @param qry
+     * @return
+     */
+    PageResult<BlinkCustomerVisitItineraryVO>  visitItineraryQueryPage(BlinkCustomerVisitItineraryQry qry);
+}

+ 10 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerVisitItineraryRepositoryMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerVisitItineraryRepository">
+    <select id="visitItineraryQueryPage" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerVisitItineraryVO">
+        select a.*
+        from blink_customer_visit_itinerary a
+        where a.deleted_flag = '0'
+        order by a.create_time desc
+    </select>
+</mapper>

+ 12 - 1
bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/api/SettingEngineController.java

@@ -96,6 +96,10 @@ public class SettingEngineController {
     public StResult getServiceMapping(String serviceName) {
         return StResult.success(settingService.getServiceMapping(serviceName));
     }
+    @GetMapping("/getQueryServiceRelated")
+    public StResult getQueryServiceRelated(String queryId) {
+        return StResult.success(settingService.getQueryServiceRelated(queryId));
+    }
 
     @GetMapping("/getEventService")
     public StResult getEventService(String serviceName) {
@@ -303,7 +307,10 @@ public class SettingEngineController {
         List<TreeNode> treeNodes = organizeService.buildDeptSelectUserTreeSearch(searchText);
         return ResponseDTO.ok(treeNodes);
     }
-
+    @GetMapping("/getQueryMainSingleForMapping")
+    public StResult getQueryMainSingleForMapping(Integer queryId) {
+        return StResult.success(settingService.getQueryMainSingleForMapping(queryId));
+    }
     @GetMapping("/getPrint")
     public StResult getPrint(String flowCode) {
         return settingService.getPrint(flowCode);
@@ -313,4 +320,8 @@ public class SettingEngineController {
     public StResult updatePrint(@RequestBody StPrint print) {
         return settingService.updatePrint(print.getFlowCode(), print.getContent());
     }
+    @GetMapping("/getScriptByFlowCode")
+    public StResult getScriptByFlowCode(String flowCode) {
+        return settingService.getScriptByFlowCode(flowCode);
+    }
 }

+ 30 - 21
bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/demo/DemoEngineController.java

@@ -2,30 +2,14 @@ package com.cloud.sa.demo;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.cloud.sa.flow.commom.aspect.EventProgram;
-import com.cloud.sa.flow.commom.common.model.StResult;
-import com.cloud.sa.flow.commom.common.system.StUserInfo;
 import com.cloud.sa.flow.commom.common.utils.StConvert;
 import com.cloud.sa.flow.commom.common.utils.StString;
-import com.cloud.sa.flow.commom.domain.entity.*;
-import com.cloud.sa.flow.commom.domain.entity.setting.StEventAdditive;
-import com.cloud.sa.flow.commom.domain.entity.setting.StEventMain;
-import com.cloud.sa.flow.commom.domain.entity.setting.StQueryMain;
-import com.cloud.sa.flow.commom.domain.virentity.TreeNode;
-import com.cloud.sa.flow.commom.service.StMenuService;
-import com.cloud.sa.flow.commom.service.StOrganizeService;
-import com.cloud.sa.flow.commom.service.setting.StAdmitService;
-import com.cloud.sa.flow.commom.service.setting.StSettingService;
-import com.cloud.sa.flow.commom.service.setting.StTaskAgentService;
-import com.cloud.sa.flow.engine.service.StFlowService;
-import com.wx.blink.base.common.annoation.NoNeedLogin;
-import com.wx.blink.base.common.domain.ResponseDTO;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.cloud.sa.flow.commom.domain.virentity.StInstanceEvent;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 /**
  * @author lc
@@ -35,8 +19,33 @@ import java.util.Map;
 @RestController
 public class DemoEngineController {
     @GetMapping("/queryTest")
-    public JSONArray queryTest(String tt) {
-        if(StString.isNotEmpty(tt)){
+    public List<StInstanceEvent> queryTest(String tt) {
+        if (StString.isNotEmpty(tt)) {
+            return null;
+        }
+//        JSONArray jsonArray = new JSONArray();
+//        for (int i = 0; i < 10; i++) {
+//            JSONObject jsonObject = new JSONObject();
+//            jsonArray.add(jsonObject);
+//            //所有值必须是字符串,否则前端无法获取
+//            jsonObject.put("code", StConvert.toStr(i));
+//            jsonObject.put("name", i + "name");
+//            jsonObject.put("address",  LocalDateTime.now().toString());
+//            jsonObject.put("address3", i + "address");
+//            jsonObject.put("address2", null);
+//        }
+        List<StInstanceEvent> stInstanceEvents = new ArrayList<>();
+        for (int i = 0; i < 10; i++) {
+            StInstanceEvent stInstanceEvent = new StInstanceEvent();
+            stInstanceEvents.add(stInstanceEvent);
+            stInstanceEvent.setState(i);
+        }
+        return stInstanceEvents;
+    }
+
+    @PostMapping("/eventTest")
+    public JSONArray eventTest(@RequestBody StInstanceEvent event) {
+        if (StString.isNotEmpty(event.toString())) {
             return null;
         }
         JSONArray jsonArray = new JSONArray();
@@ -46,7 +55,7 @@ public class DemoEngineController {
             //所有值必须是字符串,否则前端无法获取
             jsonObject.put("code", StConvert.toStr(i));
             jsonObject.put("name", i + "name");
-            jsonObject.put("address",  LocalDateTime.now().toString());
+            jsonObject.put("address", LocalDateTime.now().toString());
             jsonObject.put("address3", i + "address");
             jsonObject.put("address2", null);
         }

+ 2 - 1
bound-link-api/sa-flow-api/src/main/java/com/cloud/sa/service/FlowUniversalService.java

@@ -3,6 +3,7 @@ package com.cloud.sa.service;
 import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.cloud.sa.flow.commom.common.utils.StString;
 import com.cloud.sa.flow.commom.domain.common.EngineParams;
 import com.cloud.sa.flow.commom.domain.entity.StInstance;
 import com.cloud.sa.flow.commom.domain.entity.StTaskitem;
@@ -69,7 +70,7 @@ public class FlowUniversalService {
         Thread thread = new Thread(() -> {
             try {
                 Thread.sleep(10000);
-                StHttpRequest.postHttpClient("http://localhost:" + port + "/bpm/core/instance/autosubmit", JSON.toJSONString(flowEnteredParam),token);
+                StHttpRequest.postHttpClient(StString.getLocalHost(port) + "/bpm/core/instance/autosubmit", JSON.toJSONString(flowEnteredParam),token);
             } catch (Exception e) {
             }
         });

BIN
bound-link-api/sa-flow-api/src/main/resources/lib/sa-flow-engine-3.0.0.jar


+ 4 - 0
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/common/utils/StString.java

@@ -111,6 +111,10 @@ public class StString extends org.apache.commons.lang3.StringUtils {
         return !isEmpty(map);
     }
 
+    public static String getLocalHost(String port) {
+        return "http://localhost:" + port;
+    }
+
     /**
      * * 判断一个字符串是否为空串
      *

+ 15 - 0
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/common/RedisKeys.java

@@ -20,6 +20,7 @@ public class RedisKeys {
     private static final String PREFIX_FORM_DATA = "form:data:";
     private static final String PREFIX_FORM_SCRIPT = "form:script:";
     private static final String PREFIX_FORM_TEMPLATE = "form:template:";
+    private static final String PREFIX_DATA_TEMPLATE = "data:template:";
     private static final String PREFIX_TEMPLATE_FIELD_DATA = "field:data:";
     private static final String PREFIX_FLOW_DATA_TEMPLATE = "field:flowData:";
     private static final String PREFIX_DATABASE_STEP = "database:step:";
@@ -218,6 +219,20 @@ public class RedisKeys {
         return ROOT + PREFIX_FLOW_DATA_TEMPLATE + flowCode;
     }
 
+    /**
+     * 获取数据模型的data
+     *
+     * @param flowCode
+     * @param sub
+     * @return
+     */
+    public static String getDataTemplate(String flowCode, String... sub) {
+        if (flowCode == null) {
+            throw new RuntimeException("flowCode不能为空!");
+        }
+        return ROOT + PREFIX_DATA_TEMPLATE + flowCode;
+    }
+
     /**
      * 通过实例id和节点id获取当前节点的step实体
      * 数据库的内容

+ 1 - 0
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/mapper/StFormTemplateMapper.java

@@ -58,6 +58,7 @@ public interface StFormTemplateMapper {
 
     List<StScript> getScriptByFlowCode(String flowCode);
 
+    List<String> getScriptKeyByFlowCode(String flowCode);
     List<StScriptHistory> getScriptHistory(@Param("flowCode") String flowCode, @Param("key") String key);
 
     List<StFormTemplateHistory> getFormTemplateHistory(@Param("flowCode") String flowCode, @Param("type") String type);

+ 19 - 0
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/virentity/DataPowerDataAudit.java

@@ -0,0 +1,19 @@
+package com.cloud.sa.flow.commom.domain.virentity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lc
+ * @date 2025/1/24 11:10
+ */
+@Data
+public class DataPowerDataAudit {
+    private String field; // 字段名称
+    private String fieldCode; // 字段代码
+    private boolean view = true; // 是否可查看
+    private boolean write = false; // 是否可编辑
+    private boolean require = false; // 是否必填
+    private List<DataPowerDataAudit> children; // 子字段
+}

+ 17 - 0
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/domain/virentity/DataPowerDataCirculate.java

@@ -0,0 +1,17 @@
+package com.cloud.sa.flow.commom.domain.virentity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lc
+ * @date 2025/1/24 11:10
+ */
+@Data
+public class DataPowerDataCirculate {
+    private String field; // 字段名称
+    private String fieldCode; // 字段代码
+    private boolean view = true; // 是否可查看
+    private List<DataPowerDataCirculate> children; // 子字段
+}

+ 23 - 4
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/service/data/StDataService.java

@@ -1,18 +1,25 @@
 package com.cloud.sa.flow.commom.service.data;
 
+
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.cloud.sa.flow.commom.aspect.CacheProgram;
 import com.cloud.sa.flow.commom.common.redis.StRedisCache;
 import com.cloud.sa.flow.commom.common.system.StUserInfo;
+
 import com.cloud.sa.flow.commom.domain.common.RedisKeys;
 import com.cloud.sa.flow.commom.domain.entity.StDataTemplate;
+
 import com.cloud.sa.flow.commom.domain.mapper.StCommonMapper;
 import com.cloud.sa.flow.commom.domain.mapper.StDataTemplateMapper;
+
 import com.cloud.sa.flow.commom.domain.virentity.Column;
 import com.cloud.sa.flow.commom.domain.virentity.DataPower;
+
+
 import com.cloud.sa.flow.commom.domain.virenum.ActionType;
 import com.cloud.sa.flow.commom.domain.virenum.DataType;
+
 import com.cloud.sa.flow.commom.service.genSql.SqlGeneratorService;
 import com.cloud.sa.flow.commom.service.setting.StAdmitService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +48,7 @@ public class StDataService {
     @Autowired
     StCommonMapper commonMapper;
 
+
     public void IstDataTemplateCache(String flowCode) {
 
         //1、缓存流程数据,走实体字段相关的先走一遍再用
@@ -53,14 +61,24 @@ public class StDataService {
         }
     }
 
-    public void removeDataTemplateCache(String flowCode) {
+    public void removeDataTemplateFieldCache(String flowCode) {
         String templateFieldKey = RedisKeys.getTemplateFieldData(flowCode);
         rd.deleteObject(templateFieldKey);
     }
+    public void removeDataTemplateCache(String flowCode) {
+        String dataTemplateKey = RedisKeys.getDataTemplate(flowCode);
+        rd.deleteObject(dataTemplateKey);
+    }
 
     public StDataTemplate getStDataTemplate(String flowCode) {
-        StDataTemplate stDataTemplate = stDataTemplateMapper.getStDataTemplate(flowCode);
-        return stDataTemplate;
+        String dataTemplateKey = RedisKeys.getDataTemplate(flowCode);
+        if (rd.hasKey(dataTemplateKey)) {
+            return rd.getCacheObject(dataTemplateKey);
+        } else {
+            StDataTemplate stDataTemplate = stDataTemplateMapper.getStDataTemplate(flowCode);
+            rd.setCacheObject(dataTemplateKey, stDataTemplate);
+            return stDataTemplate;
+        }
     }
 
     public List<Column> getStDataColumn(String flowCode) {
@@ -77,7 +95,7 @@ public class StDataService {
     public List<DataPower> getFlowDataTemplate(String flowCode) {
         String flowDataRedisKey = RedisKeys.getFlowDataTemplate(flowCode);
         if (rd.hasKey(flowDataRedisKey) == false) {
-            StDataTemplate stDataTemplate = stDataTemplateMapper.getStDataTemplate(flowCode);
+            StDataTemplate stDataTemplate = getStDataTemplate(flowCode);
             if (stDataTemplate == null) {
                 return null;
             }
@@ -144,6 +162,7 @@ public class StDataService {
             for (Column column : collectColumnsChildren) {
                 tableFieldDeal("m_" + column.getCode(), column.getChildren());
             }
+
         }
     }
 

+ 28 - 5
bound-link-api/sa-flow-common/src/main/java/com/cloud/sa/flow/commom/service/setting/StSettingService.java

@@ -16,10 +16,7 @@ import com.cloud.sa.flow.commom.common.utils.StConvert;
 import com.cloud.sa.flow.commom.common.utils.StString;
 import com.cloud.sa.flow.commom.domain.common.RedisKeys;
 import com.cloud.sa.flow.commom.domain.common.StGlobalConstant;
-import com.cloud.sa.flow.commom.domain.entity.StCommonComment;
-import com.cloud.sa.flow.commom.domain.entity.StFlowExceptional;
-import com.cloud.sa.flow.commom.domain.entity.StPrint;
-import com.cloud.sa.flow.commom.domain.entity.StPrintHistory;
+import com.cloud.sa.flow.commom.domain.entity.*;
 import com.cloud.sa.flow.commom.domain.entity.setting.StEventAdditive;
 import com.cloud.sa.flow.commom.domain.entity.setting.StEventMain;
 import com.cloud.sa.flow.commom.domain.entity.setting.StQueryMain;
@@ -75,7 +72,13 @@ public class StSettingService {
     @Value("${server.port}")
     private String port;
 
+    @Autowired
+    StFormTemplateMapper stFormTemplateMapper;
 
+    public StResult getScriptByFlowCode(String flowCode) {
+        List<String> scriptByFlowCode = stFormTemplateMapper.getScriptKeyByFlowCode(flowCode);
+        return StResult.success(scriptByFlowCode);
+    }
     //region 数据查询
     public synchronized void istQueryMain(StQueryMain queryMain) {
         //TODO 插入后,要预制columns,目前先让手动写
@@ -109,8 +112,9 @@ public class StSettingService {
 
     private List<Map<String, String>> getQuerySData(StQueryMain singleQueryMain, String query, String queryMapField) {
         if ("1".equals(singleQueryMain.getQueryType())) {
+            //如果是接口的
             try {
-                String url = "http://localhost:" + port + singleQueryMain.getQuerySql();
+                String url = StString.getLocalHost(port) + singleQueryMain.getQuerySql();
                 if (StString.isNotEmpty(queryMapField)) {
                     JSONArray jsonArray = JSONArray.parseArray(queryMapField);
                     for (Object item : jsonArray) {
@@ -166,6 +170,7 @@ public class StSettingService {
                 throw new RuntimeException(e);
             }
         } else {
+            //如果是sql的
             String sql = sqlGenerator.getQueryConcatSql(singleQueryMain.getQuerySql().replaceAll("\\s+$", "").replaceAll(";+$", ""), query);
             //将所有连续的空白字符替换为一个空格
             sql = sql.replaceAll("\\s{2,}", " ");
@@ -232,6 +237,24 @@ public class StSettingService {
         });
         return queryMainDTOS;
     }
+
+    public StResult getQueryServiceRelated(String queryId) {
+        List<Map<String, String>> queryDataList = commonMapper.getQueryDataList("" +
+                "select flow_code flowCode,flow_name flowName from st_flow_menu where flow_code in (\n" +
+                "select flow_code from st_form_template where content like '%\"queryService\":" + queryId + ",%'\n" +
+                "union \n" +
+                "select flow_code from st_form_template where content like '%\"queryService\": " + queryId + ",%')");
+        return StResult.success(queryDataList);
+    }
+
+    public StQueryMainDTO getQueryMainSingleForMapping(Integer queryId) {
+        StQueryMain singleQueryMain = settingMapper.getSingleQueryMain(queryId);
+        singleQueryMain.initList();
+        StQueryMainDTO queryMainDTO = StConvert.copy(singleQueryMain, StQueryMainDTO.class);
+        return queryMainDTO;
+    }
+
+
     //endregion
 
     /**

+ 5 - 1
bound-link-api/sa-flow-common/src/main/resources/mapper/StFormTemplateMapper.xml

@@ -122,7 +122,11 @@
         FROM st_script
         WHERE flow_code = #{flowCode}
     </select>
-
+    <select id="getScriptKeyByFlowCode" resultType="java.lang.String">
+        SELECT `key`
+        FROM st_script
+        WHERE flow_code = #{flowCode}
+    </select>
     <select id="deleteAndInsertScript" parameterType="com.cloud.sa.flow.commom.domain.entity.StScript">
         DELETE
         from st_script

+ 1 - 1
bound-link-api/sa-flow-common/src/main/resources/mapper/StTaskitemMapper.xml

@@ -56,7 +56,7 @@
     <delete id="deleteTaskById">
         delete
         from st_taskitem
-        where objectid in (#{ids})
+        where objectid in ('${ids}')
     </delete>