Quellcode durchsuchen

Merge branch 'test2' of jishutao/kede-server into prod

anderx vor 1 Jahr
Ursprung
Commit
64af64549b
29 geänderte Dateien mit 991 neuen und 120 gelöschten Zeilen
  1. 8 0
      pom.xml
  2. 2 5
      src/main/java/com/goafanti/RD/controller/RDController.java
  3. 2 0
      src/main/java/com/goafanti/common/constant/AFTConstants.java
  4. 14 0
      src/main/java/com/goafanti/common/controller/PublicController.java
  5. 2 17
      src/main/java/com/goafanti/common/dao/UserMapper.java
  6. 2 1
      src/main/java/com/goafanti/common/mapper/UserArchivesMapper.xml
  7. 1 1
      src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml
  8. 97 73
      src/main/java/com/goafanti/common/mapper/UserMapper.xml
  9. 63 2
      src/main/java/com/goafanti/common/model/User.java
  10. 30 0
      src/main/java/com/goafanti/common/service/ImageService.java
  11. 7 0
      src/main/java/com/goafanti/core/mybatis/BaseMybatisDao.java
  12. 34 0
      src/main/java/com/goafanti/customer/bo/InputUserClueBo.java
  13. 86 0
      src/main/java/com/goafanti/customer/bo/InputUserClueList.java
  14. 34 0
      src/main/java/com/goafanti/customer/bo/InputUserClueTransferBo.java
  15. 9 0
      src/main/java/com/goafanti/customer/bo/OutSelectUserArchives.java
  16. 5 0
      src/main/java/com/goafanti/customer/bo/OutUserClueBo.java
  17. 72 0
      src/main/java/com/goafanti/customer/bo/OutUserClueExcel.java
  18. 96 0
      src/main/java/com/goafanti/customer/bo/OutUserClueList.java
  19. 90 0
      src/main/java/com/goafanti/customer/controller/UserClueApiController.java
  20. 3 1
      src/main/java/com/goafanti/customer/service/CustomerService.java
  21. 18 0
      src/main/java/com/goafanti/customer/service/UserClueService.java
  22. 3 3
      src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java
  23. 279 0
      src/main/java/com/goafanti/customer/service/impl/UserClueServiceImpl.java
  24. 12 7
      src/main/java/com/goafanti/customer/service/impl/UserOutboundServiceImpl.java
  25. 1 1
      src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java
  26. 2 0
      src/main/java/com/goafanti/order/controller/StatisticsApiController.java
  27. 4 5
      src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java
  28. 9 3
      src/main/resources/props/config_local.properties
  29. 6 1
      src/main/resources/props/config_test.properties

+ 8 - 0
pom.xml

@@ -461,6 +461,14 @@
 			<version>0.2.15</version>
 			<scope>compile</scope>
 		</dependency>
+		<!--        orc智能识别-->
+		<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
+<!--		<dependency>-->
+<!--			<groupId>net.sourceforge.tess4j</groupId>-->
+<!--			<artifactId>tess4j</artifactId>-->
+<!--			<version>5.8.0</version>-->
+<!--		</dependency>-->
+
 
 	</dependencies>
 	<build>

+ 2 - 5
src/main/java/com/goafanti/RD/controller/RDController.java

@@ -85,7 +85,6 @@ public class RDController extends BaseApiController {
     /**
      * 	Excel批量导入
      *
-     * @return
      */
     @RequestMapping(value = "/import" , method = RequestMethod.POST)
     public Result importTemplate(@RequestParam(value = "file", required = false) MultipartFile file) {
@@ -107,13 +106,11 @@ public class RDController extends BaseApiController {
     /**
      * 	批量导入回款模版
      *
-     * @return
      */
     @RequestMapping(value = "/downloadTemplate", method = RequestMethod.GET)
     public void downloadTemplate(HttpServletResponse response) {
-        Result res = new Result();
-        StringBuffer url= new StringBuffer(uploadPath);
-        url=url.append("/tmp").append("/RD_details_template.xlsx");
+        StringBuilder url= new StringBuilder(uploadPath);
+        url.append("/tmp").append("/RD_details_template.xlsx");
         try {
             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
             FileUtils.setAttachmentResponseHeader(response, url.toString(),"研发活动导入模版.xlsx");

+ 2 - 0
src/main/java/com/goafanti/common/constant/AFTConstants.java

@@ -69,6 +69,8 @@ public class AFTConstants {
 	public static final String  FINANCE_MANAGER						= "997";
 	/** 营销经理 */
 	public static final String  SALESMAN_MANAGER                    = "996";
+	/** 营销经理 */
+	public static final String  CLUE_MANAGER                    = "986";
 	/** 客服营销员 */
 	public static final String  CUSTOMER_SERVICE_SALESMAN     		= "960";
 	/**	技术员 */

+ 14 - 0
src/main/java/com/goafanti/common/controller/PublicController.java

@@ -9,6 +9,7 @@ import com.goafanti.common.constant.ErrorConstants;
 import com.goafanti.common.enums.UserType;
 import com.goafanti.common.model.User;
 import com.goafanti.common.service.DistrictGlossoryService;
+import com.goafanti.common.service.ImageService;
 import com.goafanti.common.service.IndustryCategoryService;
 import com.goafanti.common.service.PovertyService;
 import com.goafanti.common.utils.*;
@@ -96,6 +97,8 @@ public class PublicController extends CertifyApiController {
 	private OrderProjectService orderProjectService;
 	@Resource
 	private UserOutboundService userOutboundService;
+	@Resource
+	private ImageService imageService;
 
 	@Value(value = "${patentTemplate}")
 	private String					patentTemplate		= null;
@@ -988,4 +991,15 @@ public class PublicController extends CertifyApiController {
 		System.out.println(in);
 		return new Result<>().data(userOutboundService.pushCallCompleted(in));
 	}
+
+
+//	/**
+//	 * OCR识别
+//	 */
+//	@PostMapping("/OCR")
+//	@ResponseBody
+//	public Result ImageOCR(@RequestParam(value = "file", required = false) MultipartFile file) {
+//
+//		return new Result<>().data(imageService.ImageOCR(file));
+//	}
 }

+ 2 - 17
src/main/java/com/goafanti/common/dao/UserMapper.java

@@ -23,7 +23,7 @@ import java.util.Map;
  * (User)表数据库访问层
  *
  * @author makejava
- * @since 2024-11-19 15:44:01
+ * @since 2024-11-28 15:18:27
  */
 public interface UserMapper {
 
@@ -37,13 +37,6 @@ public interface UserMapper {
 
 
 
-    /**
-     * 统计总行数
-     *
-     * @param user 查询条件
-     * @return 总行数
-     */
-    int findUserCount(User user);
 
     /**
      * 新增数据
@@ -55,14 +48,7 @@ public interface UserMapper {
 
 
 
-    /**
-     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
-     *
-     * @param entities List<User> 实例对象列表
-     * @return 影响行数
-     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
-     */
-    int insertOrUpdateBatch(@Param("entities") List<User> entities);
+
 
     /**
      * 修改数据
@@ -316,4 +302,3 @@ public interface UserMapper {
     int selectUserLevel(String aid);
 }
 
-

+ 2 - 1
src/main/java/com/goafanti/common/mapper/UserArchivesMapper.xml

@@ -299,7 +299,8 @@
     <select id="selectUserArchivesList" resultType="com.goafanti.customer.bo.OutSelectUserArchives">
         select a.id , a.nickname ,d1.name as  province ,d2.name as  city ,d3.name area ,a.sign_bills signBills,
         a.share_type as shareType ,d.channel_type as channelType ,e.enterprise_count as enterpriseCount,
-        c.name contactName,f.name adminName,e.channel_indicators as channelIndicators,e.update_time as updateTime,
+        c.name contactName,c.mobile contactMobile,
+        f.name adminName,e.channel_indicators as channelIndicators,e.update_time as updateTime,
         e.interview_ideas as interviewIdeas ,b.intended_project as intendedProject,
         e.interview_distribution as interviewDistribution, g.name depName,
         ic.name as  industry ,b.business_scope as businessScope ,e.financial_data as financialData,

+ 1 - 1
src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml

@@ -518,7 +518,7 @@
   </update>
   <select id="selectByUidGetCount" resultType="java.lang.Integer">
   select count(*) from user_lock_release
-  	where `type` =1 and status=0 and aid = #{aid} and uid= #{uid}
+  	where `type` =0 and status=0 and aid = #{aid} and uid= #{uid}
   </select>
   <update id="updateReleaseUser">
   update t_order_new a ,user b ,user_business  c

Datei-Diff unterdrückt, da er zu groß ist
+ 97 - 73
src/main/java/com/goafanti/common/mapper/UserMapper.xml


+ 63 - 2
src/main/java/com/goafanti/common/model/User.java

@@ -7,10 +7,10 @@ import java.util.Date;
  * (User)实体类
  *
  * @author makejava
- * @since 2024-11-19 15:44:01
+ * @since 2024-12-02 11:37:11
  */
 public class User implements  AftUser{
-    private static final long serialVersionUID = 703046321551159676L;
+    private static final long serialVersionUID = 896145436195951740L;
 
     private String id;
     /**
@@ -181,6 +181,26 @@ public class User implements  AftUser{
      * 外呼状态 0=未呼叫,1=呼叫中
      */
     private Integer callStatus;
+    /**
+     * 线索客户 0=否,1=是
+     */
+    private Integer clueStatus;
+    /**
+     * 线索客户 0=待分配,1=已分配,2=已回退,3=待处理,4=已领取
+     */
+    private Integer clueProcess;
+    /**
+     * 线索导入时间
+     */
+    private Date clueTime;
+    /**
+     * 线索录入人
+     */
+    private String clueAid;
+    /**
+     * 线索转交时间
+     */
+    private Date clueTransferTime;
 
 
     public String getId() {
@@ -526,5 +546,46 @@ public class User implements  AftUser{
     public void setCallStatus(Integer callStatus) {
         this.callStatus = callStatus;
     }
+
+    public Integer getClueStatus() {
+        return clueStatus;
+    }
+
+    public void setClueStatus(Integer clueStatus) {
+        this.clueStatus = clueStatus;
+    }
+
+    public Integer getClueProcess() {
+        return clueProcess;
+    }
+
+    public void setClueProcess(Integer clueProcess) {
+        this.clueProcess = clueProcess;
+    }
+
+    public Date getClueTime() {
+        return clueTime;
+    }
+
+    public void setClueTime(Date clueTime) {
+        this.clueTime = clueTime;
+    }
+
+    public String getClueAid() {
+        return clueAid;
+    }
+
+    public void setClueAid(String clueAid) {
+        this.clueAid = clueAid;
+    }
+
+    public Date getClueTransferTime() {
+        return clueTransferTime;
+    }
+
+    public void setClueTransferTime(Date clueTransferTime) {
+        this.clueTransferTime = clueTransferTime;
+    }
+
 }
 

+ 30 - 0
src/main/java/com/goafanti/common/service/ImageService.java

@@ -0,0 +1,30 @@
+package com.goafanti.common.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+@Service
+public class ImageService {
+
+    private static final String DATA_PATH = "D:\\tessdata";
+    private static final String LANGUAGE = "chi_sim";
+
+
+    public Object ImageOCR(MultipartFile file) {
+        String result = null;
+//        try {
+//            byte[] bytes = file.getBytes();
+//            BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
+//            ITesseract instance = new Tesseract();
+//            instance.setDatapath(DATA_PATH);
+//            instance.setLanguage(LANGUAGE);
+//            result = instance.doOCR(image);
+//            System.out.println(result);
+//            result=result.replaceAll("\\r|\\n","-").replaceAll(" ","");
+//            System.out.println(result);
+//        } catch (IOException | TesseractException e) {
+//            throw new RuntimeException(e);
+//        }
+        return result;
+    }
+}

+ 7 - 0
src/main/java/com/goafanti/core/mybatis/BaseMybatisDao.java

@@ -165,6 +165,13 @@ public class BaseMybatisDao<T> extends SqlSessionDaoSupport {
 		return findList(DEFAULT_SQL_ID, params, pageNo, pageSize);
 	}
 
+	public Pagination<?> findPage(String sqlId, String countId, Object params) {
+		Map<String, Object> map = BeanUtilsExt.pushMap(params);
+		Integer pageNo=(Integer) map.get("pageNo");
+		Integer pageSize=(Integer) map.get("pageSize");
+		return findPage(sqlId, countId, map, pageNo, pageSize);
+	}
+
 
 	public Pagination<?> findPage(String sqlId, String countId, Object params, Integer pageNo,
 								  Integer pageSize) {

+ 34 - 0
src/main/java/com/goafanti/customer/bo/InputUserClueBo.java

@@ -0,0 +1,34 @@
+package com.goafanti.customer.bo;
+
+public class InputUserClueBo {
+
+    private String userName;
+
+    private String contacts;
+
+    private String contactMobile;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getContactMobile() {
+        return contactMobile;
+    }
+
+    public void setContactMobile(String contactMobile) {
+        this.contactMobile = contactMobile;
+    }
+}

+ 86 - 0
src/main/java/com/goafanti/customer/bo/InputUserClueList.java

@@ -0,0 +1,86 @@
+package com.goafanti.customer.bo;
+
+public class InputUserClueList {
+
+    private Integer shiroType;
+    private Integer clueProcess;
+    private String aid;
+    private String belongName;
+    private String startTime;
+    private String endTime;
+    private String userName;
+    private Integer pageSize;
+    private Integer pageNo;
+
+    public String getBelongName() {
+        return belongName;
+    }
+
+    public void setBelongName(String belongName) {
+        this.belongName = belongName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getClueProcess() {
+        return clueProcess;
+    }
+
+    public void setClueProcess(Integer clueProcess) {
+        this.clueProcess = clueProcess;
+    }
+
+    public Integer getShiroType() {
+        return shiroType;
+    }
+
+    public void setShiroType(Integer shiroType) {
+        this.shiroType = shiroType;
+    }
+
+    public String getAid() {
+        return aid;
+    }
+
+    public void setAid(String aid) {
+        this.aid = aid;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+}

+ 34 - 0
src/main/java/com/goafanti/customer/bo/InputUserClueTransferBo.java

@@ -0,0 +1,34 @@
+package com.goafanti.customer.bo;
+
+public class InputUserClueTransferBo {
+    private String uid;
+    private String transferId;
+    /**
+     * 0=转交, 1退回线索客户,2=移除线索客户,3=领取线索客户
+     */
+    private Integer type;
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public String getTransferId() {
+        return transferId;
+    }
+
+    public void setTransferId(String transferId) {
+        this.transferId = transferId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}

+ 9 - 0
src/main/java/com/goafanti/customer/bo/OutSelectUserArchives.java

@@ -29,6 +29,7 @@ public class OutSelectUserArchives {
     private String industry;
     @Excel(name = "联系人")
     private String contactName;
+    private String contactMobile;
     @Excel(name = "所属人")
     private String adminName;
     @Excel(name = "意向合作项目")
@@ -58,6 +59,14 @@ public class OutSelectUserArchives {
     private Date updateTime;
     private String publicContent;
 
+    public String getContactMobile() {
+        return contactMobile;
+    }
+
+    public void setContactMobile(String contactMobile) {
+        this.contactMobile = contactMobile;
+    }
+
     public String getPublicContent() {
         return publicContent;
     }

+ 5 - 0
src/main/java/com/goafanti/customer/bo/OutUserClueBo.java

@@ -0,0 +1,5 @@
+package com.goafanti.customer.bo;
+
+public class OutUserClueBo {
+
+}

+ 72 - 0
src/main/java/com/goafanti/customer/bo/OutUserClueExcel.java

@@ -0,0 +1,72 @@
+package com.goafanti.customer.bo;
+
+import com.goafanti.common.utils.excel.Excel;
+
+public class OutUserClueExcel {
+    private String id;
+    @Excel(name = "客户姓名")
+    private String nickname;
+    @Excel(name = "联系人")
+    private String contacts;
+    @Excel(name = "联系人手机号")
+    private String contactMobile;
+    private String adminName;
+    private String clueProcess;
+    private String clueTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getContactMobile() {
+        return contactMobile;
+    }
+
+    public void setContactMobile(String contactMobile) {
+        this.contactMobile = contactMobile;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getClueProcess() {
+        return clueProcess;
+    }
+
+    public void setClueProcess(String clueProcess) {
+        this.clueProcess = clueProcess;
+    }
+
+    public String getClueTime() {
+        return clueTime;
+    }
+
+    public void setClueTime(String clueTime) {
+        this.clueTime = clueTime;
+    }
+}

+ 96 - 0
src/main/java/com/goafanti/customer/bo/OutUserClueList.java

@@ -0,0 +1,96 @@
+package com.goafanti.customer.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.goafanti.common.utils.excel.Excel;
+
+import java.util.Date;
+
+public class OutUserClueList {
+
+    private String id;
+    @Excel(name = "客户姓名")
+    private String nickname;
+    @Excel(name = "联系人")
+    private String contacts;
+    @Excel(name = "联系人手机号")
+    private String contactMobile;
+    private String adminName;
+    private String clueAname;
+    private String clueProcess;
+    private Date clueTime;
+    private Date clueTransferTime;
+
+    public String getClueAname() {
+        return clueAname;
+    }
+
+    public void setClueAname(String clueAname) {
+        this.clueAname = clueAname;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public Date getClueTransferTime() {
+        return clueTransferTime;
+    }
+
+    public void setClueTransferTime(Date clueTransferTime) {
+        this.clueTransferTime = clueTransferTime;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getContactMobile() {
+        return contactMobile;
+    }
+
+    public void setContactMobile(String contactMobile) {
+        this.contactMobile = contactMobile;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getClueProcess() {
+        return clueProcess;
+    }
+
+    public void setClueProcess(String clueProcess) {
+        this.clueProcess = clueProcess;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public Date getClueTime() {
+        return clueTime;
+    }
+
+    public void setClueTime(Date clueTime) {
+        this.clueTime = clueTime;
+    }
+}

+ 90 - 0
src/main/java/com/goafanti/customer/controller/UserClueApiController.java

@@ -0,0 +1,90 @@
+package com.goafanti.customer.controller;
+
+import com.goafanti.common.bo.Result;
+import com.goafanti.common.controller.BaseApiController;
+import com.goafanti.common.utils.excel.NewExcelUtil;
+import com.goafanti.core.mybatis.page.Pagination;
+import com.goafanti.customer.bo.*;
+import com.goafanti.customer.service.UserClueService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/admin/userClue")
+public class UserClueApiController extends BaseApiController{
+
+	@Resource
+	private UserClueService userClueService;
+	@Value(value = "${upload.path}")
+	private String			uploadPath	= null;
+
+
+	/**
+	 * 客户线索列表
+	 * @param in
+	 * @return
+	 */
+	@GetMapping("/list")
+	public Result<Pagination<OutUserClueList>> list(InputUserClueList in) {
+		return new Result(userClueService.list(in));
+	}
+
+	/**
+	 * 导入客户线索
+	 * @return
+	 */
+	@PostMapping("/import")
+	public Result importUserClue( @RequestParam(value = "file", required = false) MultipartFile file) {
+		NewExcelUtil<OutUserClueExcel> excelUtil=new NewExcelUtil<>(OutUserClueExcel.class);
+		List<OutUserClueExcel> list =null;
+        try {
+            list=excelUtil.importExcel(file.getInputStream(),1);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+		Result res = new Result();
+		return res.data(userClueService.pushImportUserClue(list));
+	}
+
+	/**
+	 * 导出客户线索模版
+	 * @return
+	 */
+	@GetMapping("/exportTemplate")
+	public Result exportList( ) {
+		NewExcelUtil<OutUserClueExcel> excelUtil=new NewExcelUtil<>(OutUserClueExcel.class);
+		return excelUtil.exportExcel(null,"客户线索模版",uploadPath);
+	}
+
+	/**
+	 * 新增客户线索
+	 * @return
+	 */
+	@PostMapping("/add")
+	public Result add( InputUserClueBo in) {
+		Result res = new Result();
+		return res.data(userClueService.add(in));
+	}
+
+
+	/**
+	 * 线索客户转移
+	 * @param in type 0=转交, 1退回线索客户,2=移除线索客户,3=领取线索客户
+	 * @return
+	 */
+	@PostMapping("/transfer")
+	public Result transfer( InputUserClueTransferBo in) {
+		Result res = new Result();
+		if (in.getType()==0&&in.getTransferId()==null){
+			res.getError().add(buildError("转移编号不能为空"));
+			return res;
+		}
+		return res.data(userClueService.updateTransfer(in));
+	}
+
+
+}

+ 3 - 1
src/main/java/com/goafanti/customer/service/CustomerService.java

@@ -118,7 +118,9 @@ public interface CustomerService {
 	int addCustomer(InputAddCustomer in)  throws BusinessException;
 
 
-	/**
+    void checkUserName(InputAddCustomer in);
+
+    /**
 	 * 查询单位客户详情
 	 * @param uid 用户ID
 	 * @return

+ 18 - 0
src/main/java/com/goafanti/customer/service/UserClueService.java

@@ -0,0 +1,18 @@
+package com.goafanti.customer.service;
+
+import com.goafanti.core.mybatis.page.Pagination;
+import com.goafanti.customer.bo.*;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserClueService {
+    Pagination<OutUserClueList> list(InputUserClueList in);
+
+    Object add(InputUserClueBo in);
+
+
+    Map<String, Object> pushImportUserClue(List<OutUserClueExcel> list);
+
+    Object updateTransfer(InputUserClueTransferBo in);
+}

+ 3 - 3
src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java

@@ -504,8 +504,8 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 	}
 
 
-
-    private void checkUserName(InputAddCustomer in) {
+	@Override
+	public void checkUserName(InputAddCustomer in) {
 		if (!userMapper.checkUser("", in.getName(), "", in.getType(), null, null).isEmpty())
 			throw new BusinessException(new Error(ErrorConstants.CUSTOMER_ALREADY_EXIST, in.getName(), ""));
 		String name2=null;
@@ -1387,6 +1387,7 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 			if (use.getSignBills()==0){
 				user.setShareType(AFTConstants.USER_SHARE_PRIVATE);
 				addUserLock(uid, TokenManager.getAdminId(), now, uList); // 指定用户锁定客户
+				organizationContactBookMapper.updateAdmin(uid,aid);
 			}else if (use.getSignBills()==1){
 				user.setShareType(AFTConstants.USER_SHARE_SIGN);
 			}
@@ -1394,7 +1395,6 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 			user.setSource(2);// 客户来源设置为领取
 			addUserTransferLog(uid, TokenManager.getAdminId(), null,1, null, now, uList);
 			updateUserMid(aid,uid,0,null);
-//			organizationContactBookMapper.updateAdmin(uid,aid);
 			//转交
 		} else if (typeFlag) {
 			if (!isUs) {

+ 279 - 0
src/main/java/com/goafanti/customer/service/impl/UserClueServiceImpl.java

@@ -0,0 +1,279 @@
+package com.goafanti.customer.service.impl;
+
+import com.goafanti.common.constant.AFTConstants;
+import com.goafanti.common.dao.*;
+import com.goafanti.common.enums.IdentityProcess;
+import com.goafanti.common.enums.UserLevel;
+import com.goafanti.common.error.BusinessException;
+import com.goafanti.common.model.*;
+import com.goafanti.common.utils.PasswordUtil;
+import com.goafanti.core.mybatis.BaseMybatisDao;
+import com.goafanti.core.mybatis.page.Pagination;
+import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.customer.bo.*;
+import com.goafanti.customer.service.UserClueService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Service
+public class UserClueServiceImpl extends BaseMybatisDao<UserMapper> implements UserClueService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private UserMidMapper userMidMapper;
+    @Resource
+    private UserTransferLogMapper userTransferLogMapper;
+    @Resource
+    private AdminMapper adminMapper;
+    @Resource
+    private UserLockReleaseMapper userLockReleaseMapper;
+    @Resource
+    private UserNamesMapper userNamesMapper;
+    @Resource
+    private OrganizationContactBookMapper organizationContactBookMapper;
+    @Resource
+    private OrganizationIdentityMapper organizationIdentityMapper;
+
+
+
+
+    @Resource(name = "passwordUtil")
+    private PasswordUtil					passwordUtil;
+
+    @Override
+    public Pagination<OutUserClueList> list(InputUserClueList in) {
+        if (TokenManager.hasRole(AFTConstants.SUPERADMIN)){
+            in.setShiroType(0);
+        }
+        if (in.getShiroType()==null){
+            in.setShiroType(2);
+        }
+        in.setAid(TokenManager.getAdminId());
+        if(in.getEndTime()!=null)in.setEndTime(in.getEndTime()+ " 23:59:59");
+        return (Pagination<OutUserClueList>)findPage("selectUserClueList", "selectUserClueCount", in);
+    }
+
+    @Override
+    public Object add(InputUserClueBo in) throws BusinessException{
+        User user = new User();
+        Date now = new Date();
+        String aid= TokenManager.getAdminId();
+        String uid = UUID.randomUUID().toString();
+        String identifyId = UUID.randomUUID().toString();
+        user.setId(uid);
+        user.setSource(1);// 客户来源为录入
+        user.setIdentifyName(in.getUserName());
+        user.setNickname(in.getUserName());
+        user.setUsername(in.getUserName());
+        user.setStatus(AFTConstants.USER_STATUS_NORMAL);
+        user.setShareType(1);
+        user.setAid(TokenManager.getAdminId());
+        user.setClueAid(TokenManager.getAdminId());
+//		user.setAid("1");
+        user.setType(1);
+        user.setLvl(UserLevel.CERTIFIED.getCode());
+        user.setCreateTime(now);
+        user.setTransferTime(now);
+        user.setUpdateTime(now);
+        user.setSignBills(0);
+        user.setNewChannel(0);
+        user.setMobile(in.getContactMobile());
+        user.setPassword(AFTConstants.INITIALPASSWORD);
+        user.setInformationMaintainer(TokenManager.getAdminId());
+        double f = 0;
+        user.setIntegrity(f);
+//		user.setInformationMaintainer("1");
+        user.setChannel(0);
+        user.setClueProcess(0);
+        user.setClueStatus(1);
+        user.setClueTime(now);
+        passwordUtil.encryptPassword(user);
+        String aname = adminMapper.queryById(TokenManager.getAdminId()).getName();
+        UserMid um=new UserMid();
+        um.setAid(user.getAid());
+        um.setUid(uid);
+        userMidMapper.insertSelective(um);
+        // 创建企业认证信息
+        OrganizationIdentity oi = new OrganizationIdentity();
+        oi.setUnitName(in.getUserName());
+        oi.setId(identifyId);
+        oi.setUid(uid);
+        oi.setContacts(in.getContacts());
+        oi.setContactMobile(in.getContactMobile());
+        oi.setHighTechZone(AFTConstants.NO);
+        oi.setInternational(AFTConstants.NO);
+        oi.setListed(AFTConstants.NO);
+        oi.setAuditStatus(IdentityProcess.SUCCESS.getCode()); // 实名企业
+        organizationIdentityMapper.insert(oi);
+        userMapper.insertSelective(user);
+        UserNames un=new UserNames();
+        un.setUid(uid);
+        un.setAid(aid);
+        un.setName(user.getNickname());
+        userNamesMapper.insertSelective(un);
+        // 新增企业联系人
+        OrganizationContactBook cob = new OrganizationContactBook();
+        cob.setAid(TokenManager.getAdminId());
+        cob.setAname(aname);
+        cob.setId(UUID.randomUUID().toString());
+        cob.setUid(uid);
+        cob.setName(in.getContacts());
+        cob.setMobile(in.getContactMobile());
+        cob.setMajor(AFTConstants.YES);
+        organizationContactBookMapper.insert(cob);
+        addUserTransferLog(user,22,null);
+        return 1;
+    }
+
+    @Override
+    public Map<String, Object> pushImportUserClue(List<OutUserClueExcel> list) {
+        StringBuilder msg = new StringBuilder();
+        int size=0;
+        for (OutUserClueExcel e : list) {
+            try {
+                checkMobile(e.getContactMobile());
+                checkContacts(e.getContacts());
+                //判定客户名称
+                checkUserName(e.getNickname());
+            }catch (BusinessException ex){
+                size++;
+                msg.append("<br/>客户[").append(e.getNickname()).append("]导入失败,原因:").append(ex.getMessage()).append(" ");
+                continue;
+            }
+            InputUserClueBo inUserClueBo = new InputUserClueBo();
+            inUserClueBo.setUserName(e.getNickname());
+            inUserClueBo.setContactMobile(e.getContactMobile());
+            inUserClueBo.setContacts(e.getContacts());
+            try {
+                add(inUserClueBo);
+            }catch (Exception ex){
+                size++;
+                msg.append("<br/>客户[").append(e.getNickname()).append("]新增异常。 ");
+            }
+        }
+
+        Map<String,Object> map = new HashMap();
+        map.put("errorCount",size);
+        if (size==0){
+            msg.append("客户导入成功.");
+        }
+        map.put("msg",msg);
+        return map;
+    }
+
+    private void checkContacts(String contacts) throws BusinessException {
+        String nameReg="[\\u4e00-\\u9fa5]+.*";
+        Pattern  pattern =Pattern.compile(nameReg);
+        Matcher matcher = pattern.matcher(contacts);
+        if (!matcher.matches()){
+            throw new BusinessException("联系人名称名称格式不正确");
+        }
+    }
+
+    private void checkMobile(String contactMobile) throws BusinessException{
+        String mobileReg="[1-9]\\d{10}";
+        String mobileReg2="^0\\d{2,3}-?\\d{7,8}$";
+        Pattern  pattern =Pattern.compile(mobileReg);
+        Matcher matcher = pattern.matcher(contactMobile);
+        if (!matcher.matches()){
+            Pattern  pattern2 =Pattern.compile(mobileReg2);
+            Matcher matcher2 = pattern2.matcher(contactMobile);
+            if (!matcher2.matches()){
+                throw new BusinessException("手机号格式不正确");
+            }
+        }
+
+    }
+
+
+
+    @Override
+    public Object updateTransfer(InputUserClueTransferBo in) {
+        String[] split = in.getUid().split(",");
+        for (String uid : split) {
+            userTransfer(uid,in);
+        }
+        return 1;
+    }
+
+    private void userTransfer(String uid,InputUserClueTransferBo in) {
+        User user = userMapper.queryById(uid);
+        Date date = new Date();
+        if (!user.getAid().equals(TokenManager.getAdminId())){
+            throw new BusinessException("只能操作所属客户");
+        }
+        String aid=in.getTransferId();
+        int type = 0;
+        if (in.getType()==0){
+            user.setAid(in.getTransferId());
+            user.setClueProcess(1);
+            user.setClueTransferTime(date);
+            type=23;
+        }else if (in.getType()==1){
+            user.setClueProcess(2);
+            user.setAid(user.getClueAid());
+            type=24;
+            aid=user.getClueAid();
+        }else if (in.getType()==2){
+            user.setClueProcess(3);
+            user.setTransferTime(date);
+            userMapper.update(user);
+            type=25;
+        }else if (in.getType()==3){
+            user.setClueProcess(4);
+            user.setShareType(0);
+            user.setTransferTime(date);
+            type=26;
+            if (userLockReleaseMapper.selectByUidGetCount(aid,user.getId())==0){
+                UserLockRelease ulr=new UserLockRelease();
+                ulr.setId(UUID.randomUUID().toString());
+                ulr.setAid(TokenManager.getAdminId());
+                ulr.setUid(user.getId());
+                ulr.setLockTime(date);
+                ulr.setStatus(0);
+                ulr.setType(0);
+                userLockReleaseMapper.insert(ulr);
+            }
+            organizationContactBookMapper.updateAdmin(user.getId(),TokenManager.getAdminId());
+        }
+        userMapper.update(user);
+        addUserTransferLog(user,type,aid);
+    }
+
+    /**
+     *
+     * @param user 客户信息
+     * @param type  22=导入线索客户,23=转交线索客户,24=退回线索客户,25=移除线索客户,26=领取线索客户
+     */
+    private void addUserTransferLog(User user,Integer type,String transferId) {
+        UserTransferLog u = new UserTransferLog();
+        u.setUid(user.getId());
+        u.setAid(TokenManager.getAdminId());
+        if (type==23||type==24){
+            u.setTakeAid(transferId);
+        }
+        u.setType(type);
+        userTransferLogMapper.insertSelective(u);
+    }
+
+
+    private void checkUserName(String name) throws BusinessException{
+        if (!userMapper.checkUser("", name, "", 1, null, null).isEmpty())
+            throw new BusinessException("客户已经存在");
+        String name2=null;
+        if (name.contains("(")){
+            name2=name.replace("(","(").replace(")",")");
+        }else if (name.contains("(")){
+            name2=name.replace("(","(").replace(")",")");
+        }
+        if (name2!=null){
+            if (!userMapper.checkUser("", name2, "", 1, null, null).isEmpty())
+                throw new BusinessException("客户已经存在");
+        }
+    }
+}

+ 12 - 7
src/main/java/com/goafanti/customer/service/impl/UserOutboundServiceImpl.java

@@ -18,6 +18,7 @@ import com.goafanti.customer.bo.InputCallNumber;
 import com.goafanti.customer.bo.InputUserCallList;
 import com.goafanti.customer.service.UserOutboundService;
 import org.apache.shiro.crypto.hash.SimpleHash;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.socket.TextMessage;
 
@@ -26,13 +27,17 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-@Service("userOutboundService")
+@Service
 public class UserOutboundServiceImpl extends BaseMybatisDao<CallLogMapper> implements UserOutboundService {
-    static final String customer="C322";
-    static final String seq="20241101";
-    static final String pwd="084332D02CCF7B42461F34155AC8754F";
-    static final String version= "2.0.6";
-    static final String default_url ="https://webmc.zb-sx.cn:1443";
+    @Value(value = "${zbtx.customer}")
+    private final String	 customer=null;
+    @Value(value = "${zbtx.seq}")
+    private final String	 seq=null;
+    @Value(value = "${zbtx.pwd}")
+    private final String	 pwd=null;
+    @Value(value = "${zbtx.version}")
+    private final String	 version=null;
+    private final String	 default_url ="https://webmc.zb-sx.cn:1443";
 
 
 
@@ -65,7 +70,7 @@ public class UserOutboundServiceImpl extends BaseMybatisDao<CallLogMapper> imple
 
     private Map<String, Object> getAuthentication() {
         Map<String,Object> authentication=new HashMap<>();
-        authentication.put("customer","C322");
+        authentication.put("customer",customer);
         long timeMillis = System.currentTimeMillis();
         authentication.put("timestamp",timeMillis);
         authentication.put("seq",seq);

+ 1 - 1
src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java

@@ -1298,7 +1298,7 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
             int count = 0;
             if(!expenseAccounts.isEmpty()){
                 for (ExpenseAccount e2 : expenseAccounts) {
-                    if(e2.getOrderNo()!=null){
+                    if(e2!=null&& e2.getOrderNo()!=null){
                         count++;
                     }
                 }

+ 2 - 0
src/main/java/com/goafanti/order/controller/StatisticsApiController.java

@@ -206,8 +206,10 @@ public class StatisticsApiController extends CertifyApiController {
 		in.setPageNo(1);
 		Pagination<OutOrderProject> p = userStaticticsService.orderProject(in);
 		List<OutOrderProject> list = (List<OutOrderProject>) p.getList();
+
 		NewExcelUtil<OutOrderProject> excelUtil=new NewExcelUtil<>(OutOrderProject.class);
 		return excelUtil.OrderMergeAndExportExcel(list,"订单项目数据统计表",uploadPath);
+//		return excelUtil.exportExcel(list,"订单项目数据统计表",uploadPath);
 	}
 
 

+ 4 - 5
src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java

@@ -2011,13 +2011,13 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 			TOrderNew tOrderNew=tOrderNewMapper.getOrderNewDetail(t.getOrderNo());
 			orderAmount=tOrderNew.getTotalAmount();
 		}
-
 		List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(t.getOrderNo(),3);
 		List<OutNewOrderDunBo> tOrderDuns = newOrderDunMapper.selectListNewOrderDun(t.getOrderNo(),null);
 		BigDecimal taskAmount=new BigDecimal(0);
 		for (TOrderTaskBo tOrderTaskBo : tOrderTaskBos) {
-			if (tOrderTaskBo.getCommodityPrice()!=null)
-			taskAmount=taskAmount.add(tOrderTaskBo.getCommodityPrice());
+			if (tOrderTaskBo.getCommodityPrice()!=null){
+				taskAmount=taskAmount.add(tOrderTaskBo.getCommodityPrice());
+			}
 		}
 		BigDecimal dunAmount=new BigDecimal(0);
 		for (OutNewOrderDunBo tOrderDun : tOrderDuns) {
@@ -2033,8 +2033,7 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 
 	/**
 	 * 获取催款数据
-	 * @throws IOException
-	 */
+     */
 	@Override
 	public Result exportOrderDunData(String name, String orderNo, String contractNo, String starTime, String endTime, Integer specially, String aid, String adminName,
 									 String depId, Integer newStatus, Integer approval, Integer amountStatus, Integer memberType,

+ 9 - 3
src/main/resources/props/config_local.properties

@@ -1,10 +1,10 @@
 dev.name=local
 jdbc.driverClassName=com.mysql.jdbc.Driver
 
-static.host=//static.jishutao.com/1.3.29
-#static.host=//172.16.1.187/1.3.29
+static.host=//static.jishutao.com/1.3.31
+#static.host=//172.16.1.187/1.3.31
 
-#jdbc.url=jdbc\:mysql://localhost:3306/aft20240430?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+#jdbc.url=jdbc\:mysql://localhost:3306/aft20241122?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
 #jdbc.url=jdbc\:mysql://localhost:3306/aft?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
 #jdbc.username=root
 #jdbc.password=123456
@@ -93,3 +93,9 @@ easemob.client.secret=YXA61NHE0renI5N8gEgizoI5ivM9SYE
 jiguang.appKey=dbcea43366e038073452a04e
 jiguang.masterSecret=59792298288e4f635c737def
 jiguang.pushUrl=https://api.jpush.cn/v3/push
+#\u667A\u535A\u5929\u4E0B
+
+zbtx.customer=C328
+zbtx.seq=20241101
+zbtx.pwd=4321DD4A51B24C79FD1BE405A9D6AD98
+zbtx.version=2.0.6

+ 6 - 1
src/main/resources/props/config_test.properties

@@ -1,5 +1,5 @@
 dev.name=test
-static.host=//static.jishutao.com/1.3.29
+static.host=//static.jishutao.com/1.3.31
 #Driver
 jdbc.driverClassName=com.mysql.jdbc.Driver
 jdbc.url=jdbc:mysql://127.0.0.1:3306/aft?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
@@ -84,3 +84,8 @@ easemob.client.secret=YXA61NHE0renI5N8gEgizoI5ivM9SYE
 jiguang.appKey=dbcea43366e038073452a04e
 jiguang.masterSecret=59792298288e4f635c737def
 jiguang.pushUrl=https://api.jpush.cn/v3/push
+#\u667A\u535A\u5929\u4E0B
+zbtx.customer=C328
+zbtx.seq=20241101
+zbtx.pwd=4321DD4A51B24C79FD1BE405A9D6AD98
+zbtx.version=2.0.6