Ver código fonte

代码提交

wucl 2 anos atrás
pai
commit
530c745ff4
27 arquivos alterados com 924 adições e 3608 exclusões
  1. 26 0
      biz-base/src/main/java/com/dayou/controller/CustomerController.java
  2. 24 2
      biz-base/src/main/java/com/dayou/controller/GlobalConfigController.java
  3. 95 0
      biz-base/src/main/java/com/dayou/controller/MarketLogController.java
  4. 35 0
      biz-base/src/main/java/com/dayou/controller/MarketStatController.java
  5. 23 0
      dao/src/main/java/com/dayou/mapper/MarketLogMapper.java
  6. 14 0
      dao/src/main/java/com/dayou/mapper/MarketStatMapper.java
  7. 2 2
      dao/src/main/resources/mapper/GlobalConfigMapper.xml
  8. 47 0
      dao/src/main/resources/mapper/MarketLogMapper.xml
  9. 24 0
      dao/src/main/resources/mapper/MarketStatMapper.xml
  10. 2 2
      domain/src/main/java/com/dayou/entity/Customer.java
  11. 2 2
      domain/src/main/java/com/dayou/entity/GlobalConfig.java
  12. 44 0
      domain/src/main/java/com/dayou/entity/MarketLog.java
  13. 41 0
      domain/src/main/java/com/dayou/vo/MarketStatVO.java
  14. 3 0
      service/src/main/java/com/dayou/service/ICustomerService.java
  15. 2 0
      service/src/main/java/com/dayou/service/IDistrictsService.java
  16. 34 0
      service/src/main/java/com/dayou/service/IMarketLogService.java
  17. 14 0
      service/src/main/java/com/dayou/service/IMarketStatService.java
  18. 56 0
      service/src/main/java/com/dayou/service/impl/CustomerServiceImpl.java
  19. 28 0
      service/src/main/java/com/dayou/service/impl/DistrictsServiceImpl.java
  20. 11 1
      service/src/main/java/com/dayou/service/impl/GlobalConfigServiceImpl.java
  21. 101 0
      service/src/main/java/com/dayou/service/impl/MarketLogServiceImpl.java
  22. 26 0
      service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java
  23. 24 0
      service/src/main/java/com/dayou/service/impl/PaymentCollectionServiceImpl.java
  24. 0 5
      sql/20221229.sql
  25. 0 3529
      sql/20230110.sql
  26. 138 65
      sql/init.sql
  27. 108 0
      sql/menu.sql

+ 26 - 0
biz-base/src/main/java/com/dayou/controller/CustomerController.java

@@ -93,5 +93,31 @@ public class CustomerController extends BaseController {
         List<PullDownModel> ret=ConvertUtil.copyList(list, PullDownModel.class);
         return RestResponse.data(ret);
     }
+
+    /**
+     * 客户信息模板下载
+     */
+    @GetMapping(value = "/download/importTemplate")
+    public void importTemplate() {
+        try {
+            XSSFWorkbook wb = customerService.generateImportTemplate();
+
+            String fileName = "客户信息导入模板" + System.currentTimeMillis() + ".xlsx";
+
+            writeXss2Response(HttpKit.getRequest(), HttpKit.getResponse(), wb, fileName);
+        } catch (Exception e) {
+            log.error("生成客户信息导入模板异常", e);
+            ErrorCode.throwBusinessException(ErrorCode.DEFAULTERROR);
+        }
+    }
+
+    /**
+     * 客户信息导入
+     */
+    @PostMapping("/importExcel")
+    public RestResponse<Boolean> importExcel(@RequestPart("file") MultipartFile file) {
+        customerService.importExcel(file);
+        return RestResponse.data(true);
+    }
 }
 

+ 24 - 2
biz-base/src/main/java/com/dayou/controller/GlobalConfigController.java

@@ -1,24 +1,34 @@
 package com.dayou.controller;
 
 import com.dayou.utils.EnumFactory;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
 import com.dayou.service.IGlobalConfigService;
 import com.dayou.entity.GlobalConfig;
 import com.dayou.common.RestResponse;
 import org.springframework.web.bind.annotation.*;
-
+import com.dayou.common.PullDownModel;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
 /**
  * 全局配置
  *
  * @author wucl
- * @since 2022-12-07
+ * @since 2023-01-13
  */
 @RestController
 @RequestMapping("globalConfig")
@@ -73,6 +83,18 @@ public class GlobalConfigController extends BaseController {
     }
 
 
+    /**
+     * 全局配置下拉列表
+     */
+    @GetMapping("/simpleAll")
+    public RestResponse<List<PullDownModel>> simpleAll(){
+        LambdaQueryWrapper<GlobalConfig> lambdaQueryWrapper = new LambdaQueryWrapper<GlobalConfig>()
+        .select(GlobalConfig::getId,GlobalConfig::getName)
+        .eq(GlobalConfig::getDeleted,false);
+        List<GlobalConfig> list= globalConfigService.list(lambdaQueryWrapper);
+        List<PullDownModel> ret=ConvertUtil.copyList(list, PullDownModel.class);
+        return RestResponse.data(ret);
+    }
 
     /**
      * 获取所有枚举

+ 95 - 0
biz-base/src/main/java/com/dayou/controller/MarketLogController.java

@@ -0,0 +1,95 @@
+package com.dayou.controller;
+
+import com.dayou.vo.ItemLogCollectVO;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IMarketLogService;
+import com.dayou.entity.MarketLog;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * 市场人员日志
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+@RestController
+@RequestMapping("marketLog")
+@Slf4j
+public class MarketLogController extends BaseController {
+    @Autowired
+    private IMarketLogService marketLogService;
+
+    /**
+    * 市场人员日志列表
+    */
+    @GetMapping("")
+    public RestResponse<Page<MarketLog>> page(MarketLog marketLog, Page page){
+        Page<MarketLog> pages=marketLogService.selectPage(page,marketLog);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 市场人员日志详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<MarketLog> detail(@PathVariable Long id){
+        MarketLog xMarketLog =marketLogService.detail(id);
+        return RestResponse.data(xMarketLog);
+     }
+
+    /**
+     * 市场人员日志新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody MarketLog marketLog) {
+        Boolean ret = marketLogService.add(marketLog);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 市场人员日志更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody MarketLog marketLog) {
+        Boolean ret = marketLogService.update(marketLog);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 市场人员日志删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = marketLogService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 日志汇总列表
+     * @return
+     */
+    @GetMapping("/collect")
+    public RestResponse<List<ItemLogCollectVO>> logCollect( LocalDate startDate, LocalDate endDate){
+        List<ItemLogCollectVO> result = marketLogService.logCollect(startDate,endDate);
+        return RestResponse.data(result);
+    }
+
+}
+

+ 35 - 0
biz-base/src/main/java/com/dayou/controller/MarketStatController.java

@@ -0,0 +1,35 @@
+package com.dayou.controller;
+
+import com.dayou.common.RestResponse;
+import com.dayou.service.IMarketStatService;
+import com.dayou.vo.MarketStatVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 全局配置
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+@RestController
+@RequestMapping("marketStat")
+@Slf4j
+public class MarketStatController {
+
+    @Autowired
+    private IMarketStatService marketStatService;
+
+    /**
+     * 市场首页统计数据
+     * @return
+     */
+    @GetMapping("")
+    public RestResponse<MarketStatVO> marketStat(){
+        MarketStatVO marketStatVO = marketStatService.marketStat();
+        return RestResponse.data(marketStatVO);
+    }
+}

+ 23 - 0
dao/src/main/java/com/dayou/mapper/MarketLogMapper.java

@@ -0,0 +1,23 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.MarketLog;
+import com.dayou.dao.CustomBaseMapper;
+import com.dayou.vo.ItemUserLogVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ * 市场人员日志 Mapper 接口
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+public interface MarketLogMapper extends CustomBaseMapper<MarketLog> {
+
+
+    List<ItemUserLogVO> getList(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
+}

+ 14 - 0
dao/src/main/java/com/dayou/mapper/MarketStatMapper.java

@@ -0,0 +1,14 @@
+package com.dayou.mapper;
+
+import com.dayou.vo.MarketStatVO;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/1/13
+ * created with IntelliJ IDEA.
+ */
+public interface MarketStatMapper {
+    MarketStatVO marketStat();
+}

+ 2 - 2
dao/src/main/resources/mapper/GlobalConfigMapper.xml

@@ -8,7 +8,7 @@
         <result column="deleted" property="deleted" />
         <result column="created" property="created" />
         <result column="modified" property="modified" />
-        <result column="key" property="key" />
+        <result column="name" property="name" />
         <result column="field" property="field" />
         <result column="value" property="value" />
         <result column="description" property="description" />
@@ -20,7 +20,7 @@
         deleted,
         created,
         modified,
-        key, field, value, description
+        name, field, value, description
     </sql>
 
 </mapper>

+ 47 - 0
dao/src/main/resources/mapper/MarketLogMapper.xml

@@ -0,0 +1,47 @@
+<?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.dayou.mapper.MarketLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.MarketLog">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="created" property="created" />
+        <result column="modified" property="modified" />
+        <result column="user_id" property="userId" />
+        <result column="task_situation" property="taskSituation" />
+        <result column="log_date" property="logDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        ml.id,
+        ml.deleted,
+        ml.created,
+        ml.modified,
+        ml.user_id, ml.task_situation, ml.log_date
+    </sql>
+
+    <select id="getList" resultType="com.dayou.vo.ItemUserLogVO">
+        select <include refid="Base_Column_List"/>,u.name as userName
+        from market_log ml left join user u on u.id = ml.user_id
+where u.deleted = 0 and ml.deleted = 0
+        <choose>
+            <when test="startDate!=null">
+                and ml.log_date &gt;= #{startDate}
+            </when>
+            <otherwise>
+                and ml.log_date &gt;= date_add(curDate(),INTERVAL -10 DAY)
+            </otherwise>
+        </choose>
+        <choose>
+            <when test="endDate!=null">
+                and ml.log_date &lt;= #{endDate}
+            </when>
+            <otherwise>
+                and ml.log_date &lt;= curDate()
+            </otherwise>
+        </choose>
+    </select>
+
+</mapper>

+ 24 - 0
dao/src/main/resources/mapper/MarketStatMapper.xml

@@ -0,0 +1,24 @@
+<?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.dayou.mapper.MarketStatMapper">
+
+   <select id="marketStat" resultType="com.dayou.vo.MarketStatVO">
+      SELECT
+      ( SELECT VALUE FROM global_config WHERE field = 'YEAR_SALE_TARGET' AND NAME = 'MARKET' AND deleted = 0 ) AS yearSaleTarget,
+      ( SELECT VALUE FROM global_config WHERE field = 'YEAR_PAYMENT_TARGET' AND NAME = 'MARKET' AND deleted = 0 ) AS yearPaymentTarget,
+      ( SELECT count(*) FROM business_opportunity WHERE state = '跟进中' AND deleted = 0 ) AS businessNum,
+      (
+      SELECT
+      sum( amount )
+      FROM
+      item
+      WHERE
+      deleted = 0
+      AND sign_date &gt;= DATE_SUB( CURDATE(), INTERVAL dayofyear( now())- 1 DAY )
+      AND sign_date &lt;= concat( YEAR ( now()), '-12-31' )) AS yearSaleDone, ( SELECT sum( amount ) FROM payment_collection WHERE deleted = 0 AND payment_date &gt;= DATE_SUB( CURDATE(), INTERVAL dayofyear( now())- 1 DAY )
+      AND payment_date &lt;= concat( YEAR ( now()), '-12-31' )) AS yearPaymentDone, ( SELECT sum( amount ) FROM payment_collection WHERE deleted = 0 AND payment_date &gt;= concat( date_format( LAST_DAY( now()), '%Y-%m-' ), '01' )
+      AND payment_date &lt;= LAST_DAY(
+      now())) AS monthPaymentDone
+   </select>
+
+</mapper>

+ 2 - 2
domain/src/main/java/com/dayou/entity/Customer.java

@@ -27,7 +27,7 @@ public class Customer extends BaseEntity {
     /**
      * 客户名称
      */
-    @ImportCell
+    @ImportCell(notNull = true)
     @ExportCell(columnName = "客户名称")
     private String name;
 
@@ -91,7 +91,7 @@ public class Customer extends BaseEntity {
     /**
      * 客户等级
      */
-    @ImportCell
+    @ImportCell()
     @ExportCell(columnName = "客户等级")
     private String level;
 

+ 2 - 2
domain/src/main/java/com/dayou/entity/GlobalConfig.java

@@ -11,7 +11,7 @@ import com.dayou.annotation.ImportCell;
  * </p>
  *
  * @author wucl
- * @since 2022-12-07
+ * @since 2023-01-13
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -25,7 +25,7 @@ public class GlobalConfig extends BaseEntity {
      */
     @ImportCell
     @ExportCell(columnName = "键")
-    private String key;
+    private String name;
 
     @ImportCell
     @ExportCell(columnName = "")

+ 44 - 0
domain/src/main/java/com/dayou/entity/MarketLog.java

@@ -0,0 +1,44 @@
+package com.dayou.entity;
+import com.dayou.common.BaseEntity;
+import java.time.LocalDate;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 市场人员日志
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "市场人员日志")
+public class MarketLog extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 日志内容
+     */
+    @ImportCell
+    @ExportCell(columnName = "日志内容")
+    private String taskSituation;
+
+    /**
+     * 日志日期
+     */
+    @ImportCell
+    @ExportCell(columnName = "日志日期")
+    private LocalDate logDate;
+
+
+}

+ 41 - 0
domain/src/main/java/com/dayou/vo/MarketStatVO.java

@@ -0,0 +1,41 @@
+package com.dayou.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/1/13
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class MarketStatVO {
+
+    /**
+     *本年签约目标
+     */
+    private BigDecimal yearSaleTarget;
+    /**
+     *本年回款目标
+     */
+    private BigDecimal yearPaymentTarget;
+    /**
+     *潜在商机
+     */
+    private Integer businessNum;
+    /**
+     *本年已签约
+     */
+    private BigDecimal yearSaleDone;
+    /**
+     *本年已回款
+     */
+    private BigDecimal yearPaymentDone;
+    /**
+     *本月已回款
+     */
+    private BigDecimal monthPaymentDone;
+}

+ 3 - 0
service/src/main/java/com/dayou/service/ICustomerService.java

@@ -26,4 +26,7 @@ public interface ICustomerService extends IService<Customer> {
 
         Boolean delete(Long id);
 
+        XSSFWorkbook generateImportTemplate();
+
+        void importExcel(MultipartFile file);
 }

+ 2 - 0
service/src/main/java/com/dayou/service/IDistrictsService.java

@@ -24,4 +24,6 @@ public interface IDistrictsService extends IService<Districts> {
         Districts detail(Long id);
 
     List<DistrictsTreeVO> getDistrictsTree();
+
+    String getDistIds(String city, String county);
 }

+ 34 - 0
service/src/main/java/com/dayou/service/IMarketLogService.java

@@ -0,0 +1,34 @@
+package com.dayou.service;
+import com.dayou.entity.MarketLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.vo.ItemLogCollectVO;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ * 市场人员日志 服务类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+public interface IMarketLogService extends IService<MarketLog> {
+
+        Page<MarketLog> selectPage(Page page,MarketLog marketLog);
+
+        MarketLog detail(Long id);
+
+        Boolean add(MarketLog marketLog);
+
+        Boolean update(MarketLog marketLog);
+
+        Boolean delete(Long id);
+
+    List<ItemLogCollectVO> logCollect(LocalDate startDate, LocalDate endDate);
+}

+ 14 - 0
service/src/main/java/com/dayou/service/IMarketStatService.java

@@ -0,0 +1,14 @@
+package com.dayou.service;
+
+import com.dayou.vo.MarketStatVO;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/1/13
+ * created with IntelliJ IDEA.
+ */
+public interface IMarketStatService {
+    MarketStatVO marketStat();
+}

+ 56 - 0
service/src/main/java/com/dayou/service/impl/CustomerServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.dayou.dto.CustomerDTO;
 import com.dayou.entity.Customer;
 import com.dayou.entity.Districts;
+import com.dayou.entity.User;
 import com.dayou.mapper.CustomerMapper;
 import com.dayou.service.ICustomerService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -50,6 +51,21 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
 
     @Autowired
     private IDistrictsService districtsService;
+    private static final List<String> customerExcelTitles = new ArrayList();
+
+    static {
+        customerExcelTitles.add("客户名字");
+        customerExcelTitles.add("市(**市)");
+        customerExcelTitles.add("区/县(**县)");
+        customerExcelTitles.add("部门");
+        customerExcelTitles.add("职位");
+        customerExcelTitles.add("科室");
+        customerExcelTitles.add("联系电话");
+        customerExcelTitles.add("微信号");
+        customerExcelTitles.add("QQ号");
+        customerExcelTitles.add("客户等级");
+        customerExcelTitles.add("客户地址");
+    }
 
     @Override
     @SuppressWarnings("unchecked")
@@ -88,6 +104,10 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
         return  this.save(customer);
     }
 
+    public Boolean add(Customer customer){
+        customer.setCity(districtsService.getDistIds(customer.getCity(),customer.getCounty()));
+        return  this.save(customer);
+    }
     @Override
     public Boolean update(CustomerDTO customer){
         customer.setCity(JSON.toJSONString(customer.getCitys()));
@@ -99,4 +119,40 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
         //逻辑删除
         return this.removeById(id);
     }
+
+    @Override
+    public XSSFWorkbook generateImportTemplate() {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        //创建固定列的表头
+        createExcelTitle(wb);
+        return wb;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void importExcel(MultipartFile file) {
+        ExcelUtil.importExcel(Customer.class, new ExcelUtil.ImportListener<Customer>() {
+            @Override
+            public Boolean handleOneRecord(Customer customer) {
+                return add(customer);
+            }
+
+            @Override
+            public void afterImport(ExcelUtil.BatchImportResult batchImportResult) {
+
+            }
+        }, file, BatchTaskTypeEnum.DEFAULT, ExcelUtil.BatchImportStrategy.ROLL_BACK);
+    }
+
+    private void createExcelTitle(XSSFWorkbook wb) {
+        Sheet sheet = wb.createSheet("客户信息导入模板");
+        Row row = sheet.createRow(0);
+        CellStyle style = wb.createCellStyle();
+        Cell cell = null;
+        for (int i = 0; i < customerExcelTitles.size(); i++) {
+            cell = row.createCell(i);
+            cell.setCellStyle(style);
+            cell.setCellValue(customerExcelTitles.get(i));
+        }
+    }
 }

+ 28 - 0
service/src/main/java/com/dayou/service/impl/DistrictsServiceImpl.java

@@ -1,5 +1,7 @@
 package com.dayou.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.dayou.bo.MenuTreeBO;
 import com.dayou.entity.Districts;
@@ -25,6 +27,8 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Arrays;
 import java.util.List;
 import java.util.ArrayList;
 import org.springframework.transaction.annotation.Transactional;
@@ -73,4 +77,28 @@ public class DistrictsServiceImpl extends ServiceImpl<DistrictsMapper, Districts
         return results;
     }
 
+    @Override
+    public String getDistIds(String city, String county) {
+        Districts countyDis = null;
+        Districts cityDis = null;
+        if (StrUtil.isNotBlank(county)){
+            countyDis = this.getOne(new LambdaQueryWrapper<Districts>().eq(Districts::getDeep, 2).eq(Districts::getExtName, county));
+        }
+        if (StrUtil.isNotBlank(city)){
+            cityDis = this.getOne(new LambdaQueryWrapper<Districts>().eq(Districts::getDeep, 1).eq(Districts::getExtName, city));
+        }
+
+        if (countyDis!=null && cityDis!=null){
+            Long countyId = countyDis.getId();
+            Long cityId = countyDis.getPid();
+            Long xCityId = cityDis.getId();
+            Long pId = cityDis.getPid();
+
+            if (cityId.equals(xCityId)){
+                return JSON.toJSONString(Arrays.asList(pId, cityId, countyId));
+            }
+        }
+        return null;
+    }
+
 }

+ 11 - 1
service/src/main/java/com/dayou/service/impl/GlobalConfigServiceImpl.java

@@ -1,5 +1,6 @@
 package com.dayou.service.impl;
 
+import com.dayou.common.BaseEntity;
 import com.dayou.entity.GlobalConfig;
 import com.dayou.mapper.GlobalConfigMapper;
 import com.dayou.service.IGlobalConfigService;
@@ -59,7 +60,16 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigMapper, Glo
 
     @Override
     public Boolean add(GlobalConfig globalConfig){
-        return  this.save(globalConfig);
+        GlobalConfig config = this.getOne(new LambdaQueryWrapper<GlobalConfig>()
+                .eq(GlobalConfig::getName, globalConfig.getName())
+                .eq(GlobalConfig::getField, globalConfig.getField())
+                .eq(BaseEntity::getDeleted, Boolean.FALSE));
+
+        if (config == null){
+            return  this.save(globalConfig);
+        }
+        globalConfig.setId(config.getId());
+        return this.update(globalConfig);
     }
 
     @Override

+ 101 - 0
service/src/main/java/com/dayou/service/impl/MarketLogServiceImpl.java

@@ -0,0 +1,101 @@
+package com.dayou.service.impl;
+
+import com.dayou.entity.ItemUserLog;
+import com.dayou.entity.MarketLog;
+import com.dayou.mapper.MarketLogMapper;
+import com.dayou.service.IMarketLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.utils.LoginContext;
+import com.dayou.vo.ItemLogCollectVO;
+import com.dayou.vo.ItemUserLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.transaction.annotation.Transactional;
+import com.dayou.enums.BatchTaskTypeEnum;
+
+/**
+ * <p>
+ * 市场人员日志 服务实现类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-13
+ */
+@Service
+public class MarketLogServiceImpl extends ServiceImpl<MarketLogMapper, MarketLog> implements IMarketLogService {
+
+
+    @Autowired
+    private MarketLogMapper marketLogMapper;
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<MarketLog> selectPage(Page page,MarketLog marketLog){
+        return this.page(page, new QueryWrapper<MarketLog>(marketLog));
+    }
+
+
+    @Override
+    public MarketLog detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(MarketLog marketLog){
+        return  this.save(marketLog);
+    }
+
+    @Override
+    public Boolean update(MarketLog marketLog){
+        return  this.updateById(marketLog);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+
+    @Override
+    public List<ItemLogCollectVO> logCollect(LocalDate startDate, LocalDate endDate) {
+        List<ItemUserLogVO> logList = new ArrayList<>();
+        List<ItemLogCollectVO> result = new ArrayList<>();
+        logList = marketLogMapper.getList(startDate,endDate);
+        Map<Long, List<ItemUserLogVO>> collectByUser = logList.stream().collect(Collectors.groupingBy(ItemUserLog::getUserId));
+        for(Map.Entry<Long, List<ItemUserLogVO>> byUserMap : collectByUser.entrySet()){
+            Map<LocalDate, List<ItemUserLogVO>> collectByDate = byUserMap.getValue().stream().collect(Collectors.groupingBy(ItemUserLog::getLogDate));
+            for (Map.Entry<LocalDate,List<ItemUserLogVO>> byDateMap : collectByDate.entrySet()) {
+                ItemLogCollectVO itemLogCollectVO = new ItemLogCollectVO();
+                itemLogCollectVO.setLogDate(byDateMap.getKey());
+                itemLogCollectVO.setLogs(byDateMap.getValue());
+                itemLogCollectVO.setUserId(byUserMap.getKey());
+                itemLogCollectVO.setUserName(byUserMap.getValue().get(0).getUserName());
+                result.add(itemLogCollectVO);
+            }
+        }
+        Collections.sort(result);
+        return result;
+    }
+}

+ 26 - 0
service/src/main/java/com/dayou/service/impl/MarketStatServiceImpl.java

@@ -0,0 +1,26 @@
+package com.dayou.service.impl;
+
+import com.dayou.mapper.MarketStatMapper;
+import com.dayou.service.IMarketStatService;
+import com.dayou.vo.MarketStatVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/1/13
+ * created with IntelliJ IDEA.
+ */
+@Service
+public class MarketStatServiceImpl implements IMarketStatService {
+
+    @Autowired
+    private MarketStatMapper marketStatMapper;
+
+    @Override
+    public MarketStatVO marketStat() {
+        return marketStatMapper.marketStat();
+    }
+}

+ 24 - 0
service/src/main/java/com/dayou/service/impl/PaymentCollectionServiceImpl.java

@@ -1,11 +1,15 @@
 package com.dayou.service.impl;
 
+import com.dayou.common.BaseEntity;
 import com.dayou.entity.PaymentCollection;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.PaymentCollectionMapper;
+import com.dayou.service.IItemService;
 import com.dayou.service.IPaymentCollectionService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.vo.ItemPaymentVO;
 import com.dayou.vo.PaymentCollectionVO;
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -22,8 +26,12 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.stream.Collectors;
+
 import org.springframework.transaction.annotation.Transactional;
 import com.dayou.enums.BatchTaskTypeEnum;
 
@@ -41,6 +49,9 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
     @Autowired
     private PaymentCollectionMapper paymentCollectionMapper;
 
+    @Autowired
+    private IItemService iItemService;
+    
     @Override
     @SuppressWarnings("unchecked")
     public Page<PaymentCollectionVO> selectPage(Page page, PaymentCollectionVO paymentCollection){
@@ -55,6 +66,19 @@ public class PaymentCollectionServiceImpl extends ServiceImpl<PaymentCollectionM
 
     @Override
     public Boolean add(PaymentCollection paymentCollection){
+        BigDecimal totalAmount = iItemService.getById(paymentCollection.getItemId()).getAmount();
+        List<Double> doneAmount = this.list(new LambdaQueryWrapper<PaymentCollection>()
+                .select(PaymentCollection::getAmount)
+                .eq(PaymentCollection::getItemId, paymentCollection.getItemId())
+                .eq(BaseEntity::getDeleted, Boolean.FALSE)).stream().map(PaymentCollection::getAmount).collect(Collectors.toList());
+
+
+        BigDecimal sum = BigDecimal.valueOf(doneAmount.stream().reduce(0D, Double::sum));
+        BigDecimal payment = BigDecimal.valueOf(paymentCollection.getAmount());
+        BigDecimal add = sum.add(payment);
+        if (add.compareTo(totalAmount)==1){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"新增回款金额已大于合同签订金额,请检查.");
+        }
         return  this.save(paymentCollection);
     }
 

+ 0 - 5
sql/20221229.sql

@@ -1,5 +0,0 @@
-alter table user add column password_state bit(1) not null default 1 comment '初始密码状态';
-ALTER table item add COLUMN department_id BIGINT(20) comment '所属部门';
-/* 2023-01-03 新增SQL*/
-ALTER table item_user_log add COLUMN stage_id BIGINT(20) comment '阶段id';
-

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 3529
sql/20230110.sql


+ 138 - 65
sql/init.sql

@@ -11,13 +11,55 @@
  Target Server Version : 50717
  File Encoding         : 65001
 
- Date: 27/12/2022 10:14:58
+ Date: 13/01/2023 15:53:54
 */
 
 SET NAMES utf8mb4;
 SET FOREIGN_KEY_CHECKS = 0;
 
 -- ----------------------------
+-- Table structure for business_opportunity
+-- ----------------------------
+DROP TABLE IF EXISTS `business_opportunity`;
+CREATE TABLE `business_opportunity`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `customer_id` bigint(20) NULL DEFAULT NULL COMMENT '客户id',
+  `opportunity_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '机会名称',
+  `estimate_amount` double(255, 2) NULL DEFAULT NULL COMMENT '预计金额',
+  `estimate_date` date NULL DEFAULT NULL COMMENT '预计开展日期',
+  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '备注',
+  `state` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '状态',
+  `off_reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '终止原因',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '商机' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for customer
+-- ----------------------------
+DROP TABLE IF EXISTS `customer`;
+CREATE TABLE `customer`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '客户名称',
+  `city` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '省市县',
+  `county` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '区/县(已弃用)',
+  `department` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '部门',
+  `position` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '职位',
+  `section` varchar(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '科室',
+  `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '联系电话',
+  `wechat_no` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '微信号',
+  `QQ` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'QQ号',
+  `level` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '客户等级',
+  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '客户地址',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '客户表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
 -- Table structure for department
 -- ----------------------------
 DROP TABLE IF EXISTS `department`;
@@ -31,7 +73,7 @@ CREATE TABLE `department`  (
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for dict_data
@@ -68,12 +110,34 @@ CREATE TABLE `dict_type`  (
 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型' ROW_FORMAT = COMPACT;
 
 -- ----------------------------
+-- Table structure for districts
+-- ----------------------------
+DROP TABLE IF EXISTS `districts`;
+CREATE TABLE `districts`  (
+  `id` int(6) UNSIGNED NOT NULL COMMENT '编号',
+  `pid` int(6) NOT NULL DEFAULT 0 COMMENT '上级编号',
+  `deep` int(1) NOT NULL DEFAULT 0 COMMENT '层级',
+  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
+  `pinyin` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音',
+  `pinyin_shor` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '拼音缩写',
+  `ext_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '扩展名',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  `operator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人',
+  `weight` int(10) NULL DEFAULT 0 COMMENT '顺序 权重',
+  `lon` decimal(12, 8) NULL DEFAULT NULL,
+  `lat` decimal(12, 8) NULL DEFAULT NULL,
+  `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划码',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '地区' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
 -- Table structure for global_config
 -- ----------------------------
 DROP TABLE IF EXISTS `global_config`;
 CREATE TABLE `global_config`  (
   `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
-  `key` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '键',
+  `name` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '键',
   `field` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '值',
   `description` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述',
@@ -81,8 +145,8 @@ CREATE TABLE `global_config`  (
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `uk`(`key`, `field`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '全局配置' ROW_FORMAT = DYNAMIC;
+  UNIQUE INDEX `uk`(`name`, `field`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '全局配置' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for item
@@ -106,8 +170,9 @@ CREATE TABLE `item`  (
   `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  `department_id` bigint(20) NULL DEFAULT NULL COMMENT '所属部门',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目信息表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目信息表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for item_stage
@@ -126,7 +191,7 @@ CREATE TABLE `item_stage`  (
   `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '备注',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 73 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目阶段表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 80 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目阶段表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for item_user
@@ -138,7 +203,7 @@ CREATE TABLE `item_user`  (
   `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目人员表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 83 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目人员表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for item_user_log
@@ -158,8 +223,55 @@ CREATE TABLE `item_user_log`  (
   `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  `stage_id` bigint(20) NULL DEFAULT NULL COMMENT '阶段id',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目用户日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 86 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '项目用户日志' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for market_log
+-- ----------------------------
+DROP TABLE IF EXISTS `market_log`;
+CREATE TABLE `market_log`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `user_id` bigint(20) NOT NULL COMMENT '用户id',
+  `task_situation` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '日志内容',
+  `log_date` date NOT NULL COMMENT '日志日期',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '市场人员日志' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for note
+-- ----------------------------
+DROP TABLE IF EXISTS `note`;
+CREATE TABLE `note`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `user_id` bigint(20) NOT NULL COMMENT '用户id',
+  `note_date` date NOT NULL COMMENT '日期',
+  `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '便签内容',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '便签' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for payment_collection
+-- ----------------------------
+DROP TABLE IF EXISTS `payment_collection`;
+CREATE TABLE `payment_collection`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `item_id` bigint(20) NULL DEFAULT NULL COMMENT '项目id',
+  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '回款名称',
+  `amount` double(255, 2) NOT NULL COMMENT '回款金额',
+  `payment_date` date NOT NULL COMMENT '回款日期',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '回款记录' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for post
@@ -174,7 +286,7 @@ CREATE TABLE `post`  (
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for post_privilege
@@ -189,7 +301,7 @@ CREATE TABLE `post_privilege`  (
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `uk`(`post_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位菜单权限' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位菜单权限' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for user
@@ -218,10 +330,11 @@ CREATE TABLE `user`  (
   `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  `password_state` bit(1) NOT NULL DEFAULT b'1' COMMENT '初始密码状态',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `id_no`(`id_no`, `deleted`) USING BTREE,
   INDEX `idx1`(`name`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '基础用户' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '基础用户' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Table structure for user_post
@@ -236,68 +349,23 @@ CREATE TABLE `user_post`  (
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx1`(`user_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 62 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户岗位' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 72 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户岗位' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
-DROP TABLE IF EXISTS `menu`;
-CREATE TABLE `menu`  (
-  `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
-  `menu_no` varchar(127) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单编号',
-  `menu_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单code',
-  `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称',
-  `parent_id` bigint(32) NULL DEFAULT NULL COMMENT '父级菜单id',
-  `order_num` int(4) NULL DEFAULT NULL COMMENT '显示顺序',
-  `menu_type` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型 菜单/按钮',
-  `enabled` bit(1) NOT NULL DEFAULT b'1' COMMENT '状态:1:正常 0:禁用',
-  `pc_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pc端url',
-  `pc_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pc端图标',
-  `cached_views` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否缓存页面',
+-- Table structure for visit
+-- ----------------------------
+DROP TABLE IF EXISTS `visit`;
+CREATE TABLE `visit`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `customer_id` bigint(20) NOT NULL COMMENT '客户id',
+  `visit_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '拜访类型(初访、回访)',
+  `visit_time` datetime(0) NOT NULL COMMENT '拜访时间',
+  `spot` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '拜访地点',
+  `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '沟通内容',
   `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
   `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
   `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `id`(`id`) USING BTREE,
-  UNIQUE INDEX `menu_no`(`menu_no`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单' ROW_FORMAT = DYNAMIC;
-
-INSERT INTO `menu` VALUES (1, '9aaadb20-0cbc-4de4-9068-9dc93606b6be', '_view_index', '首页', NULL, 1, '目录', b'1', '/index', 'muxg', b'0', b'0', '2022-11-29 16:34:48', '2022-11-29 16:38:00.000000');
-INSERT INTO `menu` VALUES (2, '61d0a6f2-9ca8-46e7-a406-6193bf47b71a', '_view_index_rate', '项目进度首页', 1, 1, '菜单', b'1', '/index/item/rate', 'v', b'0', b'0', '2022-11-29 16:37:22', '2022-11-29 16:37:22.000000');
-INSERT INTO `menu` VALUES (3, 'fa3e25ee-3b3a-4564-90b0-7dc2245c627d', '_view_index_logs', '项目日志首页', 1, 2, '菜单', b'1', '/index/item/log', 'muxb', b'0', b'0', '2022-11-29 16:38:32', '2022-11-29 16:38:32.000000');
-INSERT INTO `menu` VALUES (4, '795fd05f-6d62-44e0-9464-a2b10cf8a712', '_view_setting', '综合设置', NULL, 3, '目录', b'1', '/setting', 'muxf', b'0', b'0', '2022-12-02 14:46:00', '2022-12-05 10:16:56.000000');
-INSERT INTO `menu` VALUES (5, '2114b3d2-91d4-4c7e-9b04-344950bfbe17', '_views_set_menu', '菜单设置', 4, 2, '菜单', b'1', '/setting/menus', 'r', b'0', b'0', '2022-12-02 14:47:35', '2022-12-02 15:04:56.000000');
-INSERT INTO `menu` VALUES (6, 'bd020a95-d8de-4938-90a0-0d2efcf87cda', '_view_item', '项目管理', NULL, 2, '目录', b'1', '/item', 'r', b'0', b'0', '2022-12-05 09:49:39', '2022-12-05 10:16:57.000000');
-INSERT INTO `menu` VALUES (11, '38b36b01-54e9-4c36-9343-1902b8b5f4ae', '_view_department', '部门管理', 4, 0, '菜单', b'1', '/setting/department', 'n', b'0', b'0', '2022-12-05 12:54:42', '2022-12-05 13:01:07.000000');
-INSERT INTO `menu` VALUES (12, 'ebfaf59e-c07d-48ad-aed0-8f8b31ace36d', '_view_post', '岗位管理', 4, 1, '菜单', b'1', '/setting/post', 'gg', b'0', b'0', '2022-12-05 13:03:39', '2022-12-05 13:03:39.000000');
-INSERT INTO `menu` VALUES (13, '2cca60d2-19bd-4b99-be47-2277c0c8bebf', '_view_user', '员工管理', 4, -1, '菜单', b'1', '/setting/user', 'i', b'0', b'0', '2022-12-05 13:05:50', '2022-12-05 13:05:50.000000');
-INSERT INTO `menu` VALUES (14, 'c426bf47-cf16-406f-b922-280eeacef149', '_view_item_list', '项目列表', 6, 0, '菜单', b'1', '/item/list', 'a', b'0', b'0', '2022-12-05 13:07:22', '2022-12-05 13:07:22.000000');
-INSERT INTO `menu` VALUES (15, '0209fe37-1b2e-4062-bde7-cb89e6bca57d', '_view_item_plan', '项目排期', 6, 1, '菜单', b'1', '/item/plan', 'muxe', b'0', b'1', '2022-12-05 13:07:35', '2022-12-16 10:11:06.632230');
-INSERT INTO `menu` VALUES (16, '60fe7887-06f5-4439-9b5b-a72b292ccc7e', '_view_my_item', '我的项目', 6, 2, '菜单', b'1', '/item/list/me', 'aa', b'0', b'0', '2022-12-05 13:07:47', '2022-12-09 16:38:47.373260');
-INSERT INTO `menu` VALUES (17, '71e811f8-e90b-4d67-a4be-3776070cca4c', '_view_my_logs', '我的日志', 6, 3, '菜单', b'1', '/logs/me', 'oo', b'0', b'0', '2022-12-05 13:07:53', '2022-12-05 13:07:53.000000');
-INSERT INTO `menu` VALUES (18, '79eb0cb4-74a0-423b-aa56-a67e625cc0f9', '_view_department_add', '新增', 11, NULL, '按钮', b'1', '/setting/department/add', 'b', b'0', b'0', '2022-12-05 14:31:40', '2022-12-05 14:31:40.000000');
-INSERT INTO `menu` VALUES (19, '8eb3cb4d-1421-4e56-9473-8b291ad7b245', '_view_department_remove', '删除', 11, 2, '按钮', b'1', '/setting/department/delete', '', b'0', b'0', '2022-12-05 14:44:57', '2022-12-05 14:44:57.000000');
-INSERT INTO `menu` VALUES (20, '1f5e2ffd-9780-4a0d-ba2a-490185226743', '_view_department_edit', '编辑', 11, 3, '按钮', b'1', '/setting/department/edit', '', b'0', b'0', '2022-12-05 14:45:53', '2022-12-05 14:45:53.000000');
-INSERT INTO `menu` VALUES (21, '492a745a-3aa5-4a14-9a1a-18e27f36953e', '_views_set_post_edit', '编辑', 12, 1, '按钮', b'1', '/setting/post/edit', '', b'0', b'0', '2022-12-05 17:07:30', '2022-12-05 17:07:30.000000');
-INSERT INTO `menu` VALUES (22, 'b5d7dbcd-1099-49ca-a457-84af4ca1a97d', '_views_set_post_remove', '删除', 12, 2, '按钮', b'1', '/setting/post/remove', '', b'0', b'0', '2022-12-05 17:08:30', '2022-12-05 17:08:30.000000');
-INSERT INTO `menu` VALUES (23, '9d31b055-7d01-472e-a874-b7b3629dbbc0', '_views_set_post_auth', '权限', 12, 3, '按钮', b'1', '/setting/post/auth', '', b'0', b'0', '2022-12-05 17:09:13', '2022-12-05 17:09:13.000000');
-INSERT INTO `menu` VALUES (24, '65ecea82-bd1c-48a8-b7d9-054a0b541a3d', '_view_post_add', '新增', 12, 4, '按钮', b'1', '/setting/post/add', '', b'0', b'0', '2022-12-05 17:22:16', '2022-12-05 17:22:16.000000');
-INSERT INTO `menu` VALUES (25, 'da2d783e-8537-4a54-bf36-55402a87772d', '_views_user_detail', '详情', 13, 1, '按钮', b'1', '/setting/user/detail', '', b'0', b'0', '2022-12-06 10:57:01', '2022-12-06 10:57:01.000000');
-INSERT INTO `menu` VALUES (26, 'e16e8bdd-dde3-4750-9d50-e5db3eec7b40', '_views_user_remove', '删除', 13, 2, '按钮', b'1', '/setting/user/delete', '', b'0', b'0', '2022-12-06 10:58:00', '2022-12-06 10:58:00.000000');
-INSERT INTO `menu` VALUES (27, 'da9a698d-b83a-4ae4-95d2-a9e8559fa53f', '_views_user_add', '新增', 13, 3, '按钮', b'1', '/setting/user/add', '', b'0', b'0', '2022-12-06 12:40:42', '2022-12-06 12:40:42.000000');
-INSERT INTO `menu` VALUES (28, 'cbc84707-fa79-4ddd-986d-33afaa2e7877', '_views_item_plan', '排期', 14, 1, '按钮', b'1', '/item/plan', 'l', b'0', b'0', '2022-12-09 14:03:27', '2022-12-16 10:10:55.000041');
-INSERT INTO `menu` VALUES (29, 'cf5e7dce-ac0b-446d-bb1d-4b311713dd10', '_views_item_detail', '详情', 14, 2, '按钮', b'1', '/item/detail', 'j', b'0', b'0', '2022-12-09 14:04:11', '2022-12-09 14:04:11.000000');
-INSERT INTO `menu` VALUES (30, '1b4a78fe-7aa6-4f67-9646-1e3f1e6f414c', '_views_item_remove', '删除', 14, 3, '按钮', b'1', '/item/delete', 'q', b'0', b'0', '2022-12-09 14:04:26', '2022-12-09 14:04:26.000000');
-INSERT INTO `menu` VALUES (31, 'da799820-f4aa-4501-b9e2-c1257890cf44', '_views_item_add', '新增', 14, 4, '按钮', b'1', '/item/add', 'oo', b'0', b'0', '2022-12-09 14:10:23', '2022-12-09 14:10:23.000000');
-INSERT INTO `menu` VALUES (32, '8a2bae68-93fb-4d3e-bb4c-b3900288f6fb', '_view_item_log_write', '写日志', 16, 3, '按钮', b'1', '/item/me/write', 'aa', b'0', b'0', '2022-12-09 16:06:46', '2022-12-09 16:06:46.000000');
-INSERT INTO `menu` VALUES (33, 'f6f7e6ae-6343-4907-9057-2e1cf317b606', '_views_item_rate', '日志', 16, 1, '按钮', b'1', '/item/rate', 'muxb', b'0', b'0', '2022-12-09 16:12:40', '2022-12-16 10:19:45.690030');
-INSERT INTO `menu` VALUES (34, '318c14bc-e0d1-44b1-8df1-28e755e5c990', '_views_item_detail_readonly', '详情', 16, 2, '按钮', b'1', '/item/detail/readonly', 'l', b'0', b'0', '2022-12-09 16:12:52', '2022-12-09 16:12:52.000000');
-INSERT INTO `menu` VALUES (35, '76f6d8cb-051a-4bcb-b4c1-a771eefddf61', '_views_logs_entry', '日志总览', 6, 5, '菜单', b'1', '/item/log/entry', 'r', b'0', b'0', '2022-12-15 11:28:10', '2022-12-15 15:01:58.036119');
-INSERT INTO `menu` VALUES (36, 'b70fc63b-1505-4a3c-bb0a-35eeddff25e4', '_views_logs_collect', '查看', 35, 1, '按钮', b'1', '/item/log/collect', 'muxl', b'0', b'0', '2022-12-15 14:59:22', '2022-12-15 14:59:22.000000');
-INSERT INTO `menu` VALUES (37, 'bdc38765-925a-45c9-9ba1-78bd270e6d37', '_views_log_detail', '详情', 17, 1, '按钮', b'1', '/item/log/detail', 'muxc', b'0', b'0', '2022-12-15 16:03:03', '2022-12-15 16:03:03.000000');
-INSERT INTO `menu` VALUES (38, '5acd26f7-07a8-4028-8b49-2136b9a27bce', '_views_log_remove', '删除', 17, 2, '按钮', b'1', '/item/log/delete', 'cc', b'0', b'0', '2022-12-15 16:04:04', '2022-12-15 16:04:04.000000');
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '拜访记录表' ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 108 - 0
sql/menu.sql

@@ -0,0 +1,108 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50717
+ Source Host           : localhost:3306
+ Source Schema         : item-management
+
+ Target Server Type    : MySQL
+ Target Server Version : 50717
+ File Encoding         : 65001
+
+ Date: 13/01/2023 15:54:27
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for menu
+-- ----------------------------
+DROP TABLE IF EXISTS `menu`;
+CREATE TABLE `menu`  (
+  `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `menu_no` varchar(127) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单编号',
+  `menu_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单code',
+  `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称',
+  `parent_id` bigint(32) NULL DEFAULT NULL COMMENT '父级菜单id',
+  `order_num` int(4) NULL DEFAULT NULL COMMENT '显示顺序',
+  `menu_type` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型 菜单/按钮',
+  `enabled` bit(1) NOT NULL DEFAULT b'1' COMMENT '状态:1:正常 0:禁用',
+  `pc_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pc端url',
+  `pc_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pc端图标',
+  `cached_views` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否缓存页面',
+  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+  `created` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
+  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `id`(`id`) USING BTREE,
+  UNIQUE INDEX `menu_no`(`menu_no`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 65 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of menu
+-- ----------------------------
+INSERT INTO `menu` VALUES (1, '9aaadb20-0cbc-4de4-9068-9dc93606b6be', '_view_index', '首页', NULL, 1, '目录', b'1', '/index', 'muxg', b'0', b'0', '2022-11-29 16:34:48', '2022-11-29 16:38:00.000000');
+INSERT INTO `menu` VALUES (2, '61d0a6f2-9ca8-46e7-a406-6193bf47b71a', '_view_index_rate', '项目进度首页', 1, 1, '菜单', b'1', '/index/item/rate', 'v', b'0', b'0', '2022-11-29 16:37:22', '2022-11-29 16:37:22.000000');
+INSERT INTO `menu` VALUES (3, 'fa3e25ee-3b3a-4564-90b0-7dc2245c627d', '_view_index_logs', '项目日志首页', 1, 2, '菜单', b'1', '/index/item/log', 'muxb', b'0', b'0', '2022-11-29 16:38:32', '2022-11-29 16:38:32.000000');
+INSERT INTO `menu` VALUES (4, '795fd05f-6d62-44e0-9464-a2b10cf8a712', '_view_setting', '综合设置', NULL, 4, '目录', b'1', '/setting', 'muxf', b'0', b'0', '2022-12-02 14:46:00', '2022-12-05 10:16:56.000000');
+INSERT INTO `menu` VALUES (5, '2114b3d2-91d4-4c7e-9b04-344950bfbe17', '_views_set_menu', '菜单设置', 4, 2, '菜单', b'1', '/setting/menus', 'r', b'0', b'0', '2022-12-02 14:47:35', '2022-12-02 15:04:56.000000');
+INSERT INTO `menu` VALUES (6, 'bd020a95-d8de-4938-90a0-0d2efcf87cda', '_view_item', '项目管理', NULL, 2, '目录', b'1', '/item', 'r', b'0', b'0', '2022-12-05 09:49:39', '2022-12-05 10:16:57.000000');
+INSERT INTO `menu` VALUES (11, '38b36b01-54e9-4c36-9343-1902b8b5f4ae', '_view_department', '部门管理', 4, 0, '菜单', b'1', '/setting/department', 'n', b'0', b'0', '2022-12-05 12:54:42', '2022-12-05 13:01:07.000000');
+INSERT INTO `menu` VALUES (12, 'ebfaf59e-c07d-48ad-aed0-8f8b31ace36d', '_view_post', '岗位管理', 4, 1, '菜单', b'1', '/setting/post', 'gg', b'0', b'0', '2022-12-05 13:03:39', '2022-12-05 13:03:39.000000');
+INSERT INTO `menu` VALUES (13, '2cca60d2-19bd-4b99-be47-2277c0c8bebf', '_view_user', '员工管理', 4, -1, '菜单', b'1', '/setting/user', 'i', b'0', b'0', '2022-12-05 13:05:50', '2022-12-05 13:05:50.000000');
+INSERT INTO `menu` VALUES (14, 'c426bf47-cf16-406f-b922-280eeacef149', '_view_item_list', '项目列表', 6, 0, '菜单', b'1', '/item/list', 'a', b'0', b'0', '2022-12-05 13:07:22', '2022-12-05 13:07:22.000000');
+INSERT INTO `menu` VALUES (15, '0209fe37-1b2e-4062-bde7-cb89e6bca57d', '_view_item_plan', '项目排期', 6, 1, '菜单', b'1', '/item/plan', 'muxe', b'0', b'1', '2022-12-05 13:07:35', '2022-12-16 10:11:06.632230');
+INSERT INTO `menu` VALUES (16, '60fe7887-06f5-4439-9b5b-a72b292ccc7e', '_view_my_item', '我的项目', 6, 2, '菜单', b'1', '/item/list/me', 'aa', b'0', b'0', '2022-12-05 13:07:47', '2022-12-09 16:38:47.373260');
+INSERT INTO `menu` VALUES (17, '71e811f8-e90b-4d67-a4be-3776070cca4c', '_view_my_logs', '我的日志', 6, 3, '菜单', b'1', '/logs/me', 'oo', b'0', b'0', '2022-12-05 13:07:53', '2022-12-05 13:07:53.000000');
+INSERT INTO `menu` VALUES (18, '79eb0cb4-74a0-423b-aa56-a67e625cc0f9', '_view_department_add', '新增', 11, NULL, '按钮', b'1', '/setting/department/add', 'b', b'0', b'0', '2022-12-05 14:31:40', '2022-12-05 14:31:40.000000');
+INSERT INTO `menu` VALUES (19, '8eb3cb4d-1421-4e56-9473-8b291ad7b245', '_view_department_remove', '删除', 11, 2, '按钮', b'1', '/setting/department/delete', '', b'0', b'0', '2022-12-05 14:44:57', '2022-12-05 14:44:57.000000');
+INSERT INTO `menu` VALUES (20, '1f5e2ffd-9780-4a0d-ba2a-490185226743', '_view_department_edit', '编辑', 11, 3, '按钮', b'1', '/setting/department/edit', '', b'0', b'0', '2022-12-05 14:45:53', '2022-12-05 14:45:53.000000');
+INSERT INTO `menu` VALUES (21, '492a745a-3aa5-4a14-9a1a-18e27f36953e', '_views_set_post_edit', '编辑', 12, 1, '按钮', b'1', '/setting/post/edit', '', b'0', b'0', '2022-12-05 17:07:30', '2022-12-05 17:07:30.000000');
+INSERT INTO `menu` VALUES (22, 'b5d7dbcd-1099-49ca-a457-84af4ca1a97d', '_views_set_post_remove', '删除', 12, 2, '按钮', b'1', '/setting/post/remove', '', b'0', b'0', '2022-12-05 17:08:30', '2022-12-05 17:08:30.000000');
+INSERT INTO `menu` VALUES (23, '9d31b055-7d01-472e-a874-b7b3629dbbc0', '_views_set_post_auth', '权限', 12, 3, '按钮', b'1', '/setting/post/auth', '', b'0', b'0', '2022-12-05 17:09:13', '2022-12-05 17:09:13.000000');
+INSERT INTO `menu` VALUES (24, '65ecea82-bd1c-48a8-b7d9-054a0b541a3d', '_view_post_add', '新增', 12, 4, '按钮', b'1', '/setting/post/add', '', b'0', b'0', '2022-12-05 17:22:16', '2022-12-05 17:22:16.000000');
+INSERT INTO `menu` VALUES (25, 'da2d783e-8537-4a54-bf36-55402a87772d', '_views_user_detail', '详情', 13, 1, '按钮', b'1', '/setting/user/detail', '', b'0', b'0', '2022-12-06 10:57:01', '2022-12-06 10:57:01.000000');
+INSERT INTO `menu` VALUES (26, 'e16e8bdd-dde3-4750-9d50-e5db3eec7b40', '_views_user_remove', '删除', 13, 2, '按钮', b'1', '/setting/user/delete', '', b'0', b'0', '2022-12-06 10:58:00', '2022-12-06 10:58:00.000000');
+INSERT INTO `menu` VALUES (27, 'da9a698d-b83a-4ae4-95d2-a9e8559fa53f', '_views_user_add', '新增', 13, 3, '按钮', b'1', '/setting/user/add', '', b'0', b'0', '2022-12-06 12:40:42', '2022-12-06 12:40:42.000000');
+INSERT INTO `menu` VALUES (28, 'cbc84707-fa79-4ddd-986d-33afaa2e7877', '_views_item_plan', '排期', 14, 1, '按钮', b'1', '/item/plan', 'l', b'0', b'0', '2022-12-09 14:03:27', '2022-12-16 10:10:55.000041');
+INSERT INTO `menu` VALUES (29, 'cf5e7dce-ac0b-446d-bb1d-4b311713dd10', '_views_item_detail', '详情', 14, 2, '按钮', b'1', '/item/detail', 'j', b'0', b'0', '2022-12-09 14:04:11', '2022-12-09 14:04:11.000000');
+INSERT INTO `menu` VALUES (30, '1b4a78fe-7aa6-4f67-9646-1e3f1e6f414c', '_views_item_remove', '删除', 14, 3, '按钮', b'1', '/item/delete', 'q', b'0', b'0', '2022-12-09 14:04:26', '2022-12-09 14:04:26.000000');
+INSERT INTO `menu` VALUES (31, 'da799820-f4aa-4501-b9e2-c1257890cf44', '_views_item_add', '新增', 14, 4, '按钮', b'1', '/item/add', 'oo', b'0', b'0', '2022-12-09 14:10:23', '2022-12-09 14:10:23.000000');
+INSERT INTO `menu` VALUES (32, '8a2bae68-93fb-4d3e-bb4c-b3900288f6fb', '_view_item_log_write', '写日志', 16, 3, '按钮', b'1', '/item/me/write', 'aa', b'0', b'0', '2022-12-09 16:06:46', '2022-12-09 16:06:46.000000');
+INSERT INTO `menu` VALUES (33, 'f6f7e6ae-6343-4907-9057-2e1cf317b606', '_views_item_rate', '日志', 16, 1, '按钮', b'1', '/item/rate', 'muxb', b'0', b'0', '2022-12-09 16:12:40', '2022-12-16 10:19:45.690030');
+INSERT INTO `menu` VALUES (34, '318c14bc-e0d1-44b1-8df1-28e755e5c990', '_views_item_detail_readonly', '详情', 16, 2, '按钮', b'1', '/item/detail/readonly', 'l', b'0', b'0', '2022-12-09 16:12:52', '2022-12-09 16:12:52.000000');
+INSERT INTO `menu` VALUES (35, '76f6d8cb-051a-4bcb-b4c1-a771eefddf61', '_views_logs_entry', '日志总览', 6, 5, '菜单', b'1', '/item/log/entry', 'r', b'0', b'0', '2022-12-15 11:28:10', '2022-12-15 15:01:58.036119');
+INSERT INTO `menu` VALUES (36, 'b70fc63b-1505-4a3c-bb0a-35eeddff25e4', '_views_logs_collect', '查看', 35, 1, '按钮', b'1', '/item/log/collect', 'muxl', b'0', b'0', '2022-12-15 14:59:22', '2022-12-15 14:59:22.000000');
+INSERT INTO `menu` VALUES (37, 'bdc38765-925a-45c9-9ba1-78bd270e6d37', '_views_log_detail', '详情', 17, 1, '按钮', b'1', '/item/log/detail', 'muxc', b'0', b'0', '2022-12-15 16:03:03', '2022-12-15 16:03:03.000000');
+INSERT INTO `menu` VALUES (38, '5acd26f7-07a8-4028-8b49-2136b9a27bce', '_views_log_remove', '删除', 17, 2, '按钮', b'1', '/item/log/delete', 'cc', b'0', b'0', '2022-12-15 16:04:04', '2022-12-15 16:04:04.000000');
+INSERT INTO `menu` VALUES (39, '6bbe9bd9-1fbc-4600-9197-1f21d7ccb50a', '_views_user_template', '下载模板', 13, 4, '按钮', b'1', '/setting/user/template', 'ff', b'0', b'0', '2022-12-30 10:40:11', '2022-12-30 10:40:11.000000');
+INSERT INTO `menu` VALUES (40, '6fdbfb94-0f48-4edb-9465-9a979abf9fd3', '_views_user_import', '导入员工', 13, 5, '按钮', b'1', '/setting/user/import', 'i', b'0', b'0', '2022-12-30 10:41:42', '2022-12-30 10:41:42.000000');
+INSERT INTO `menu` VALUES (41, '1eda9702-4cb6-44f6-9d2c-871e8d04e08e', '_view_market', '市场管理', NULL, 3, '目录', b'1', '/market', 'v', b'0', b'0', '2023-01-10 14:55:19', '2023-01-10 14:55:19.000000');
+INSERT INTO `menu` VALUES (42, '9c9e521c-fd9c-467f-abc9-e06fe9361d99', '_views_market_customer', '客户管理', 41, 1, '菜单', b'1', '/market/customer', 'n', b'0', b'0', '2023-01-10 14:57:44', '2023-01-10 14:57:44.000000');
+INSERT INTO `menu` VALUES (43, '321dbe97-9afb-4a70-a2eb-a395f1078600', '_views_market_business', '商机管理', 41, 2, '菜单', b'1', '/market/business', 'muxk', b'0', b'0', '2023-01-10 14:58:23', '2023-01-10 14:58:23.000000');
+INSERT INTO `menu` VALUES (44, '8cf9ddef-cde4-49ad-aee9-61069f324434', '_views_market_payment', '回款管理', 41, 3, '菜单', b'1', '/market/payment', 'nn', b'0', b'0', '2023-01-10 14:58:40', '2023-01-10 14:58:40.000000');
+INSERT INTO `menu` VALUES (45, 'b76efb90-98c1-415f-9e34-668a8b81c898', '_views_market_log', '我的日志', 41, 5, '菜单', b'1', '/market/staff/log', 'muxb', b'0', b'0', '2023-01-10 14:59:30', '2023-01-10 14:59:30.000000');
+INSERT INTO `menu` VALUES (46, 'add2e53b-834e-4752-a440-4336cb684418', '_views_market_visit', '拜访记录', 41, 4, '菜单', b'1', '/market/visit', 'aa', b'0', b'0', '2023-01-10 15:00:02', '2023-01-10 15:00:02.000000');
+INSERT INTO `menu` VALUES (47, '9727bac3-f5c5-4d75-b7e5-91ab57fe02a7', '_views_market_customer_add', '新增', 42, 1, '按钮', b'1', '/market/customer/add', '', b'0', b'0', '2023-01-10 15:23:52', '2023-01-10 15:23:52.000000');
+INSERT INTO `menu` VALUES (48, '7a95180c-b66f-46a7-9947-964c248da089', '_views_market_customer_remove', '删除', 42, 2, '按钮', b'1', '/market/customer/delete', '', b'0', b'0', '2023-01-10 15:25:06', '2023-01-10 15:25:06.000000');
+INSERT INTO `menu` VALUES (49, 'abada02e-5985-4f35-a655-37da4173692e', '_views_market_customer_detail', '详情', 42, 3, '按钮', b'1', '/market/customer/detail', '', b'0', b'0', '2023-01-10 15:25:49', '2023-01-10 15:25:49.000000');
+INSERT INTO `menu` VALUES (50, '381aada5-6b89-49c0-8ab3-98056cbf65d3', '_views_market_business_detail', '详情', 43, 1, '按钮', b'1', '/market/business/detail', '', b'0', b'0', '2023-01-11 12:44:50', '2023-01-11 12:44:50.000000');
+INSERT INTO `menu` VALUES (51, 'ea79ba6e-6cab-49d3-b7db-bc56b835a794', '_views_market_business_state', '流转', 43, 2, '按钮', b'1', '/market/business/state', '', b'0', b'0', '2023-01-11 12:45:24', '2023-01-11 12:45:24.000000');
+INSERT INTO `menu` VALUES (52, '9c206006-1d28-4a9c-b5d4-91b45b14db3a', '_views_market_business_add', '新增', 43, 3, '按钮', b'1', '/market/business/save', '', b'0', b'0', '2023-01-11 13:29:39', '2023-01-11 13:29:39.000000');
+INSERT INTO `menu` VALUES (53, 'b4a82a11-b447-48f7-aa95-9261a42ede46', '_views_market_payment_list', '回款明细', 44, 1, '按钮', b'1', '/market/payment/list', '', b'0', b'0', '2023-01-11 15:17:26', '2023-01-11 15:17:26.000000');
+INSERT INTO `menu` VALUES (54, 'd33a929e-1ea9-435b-aa47-7269ba81f414', '_views_market_payment_add', '新增回款', 44, 2, '按钮', b'1', '/market/payment/add', '', b'0', b'0', '2023-01-11 15:17:36', '2023-01-11 15:17:36.000000');
+INSERT INTO `menu` VALUES (55, 'c72fc6ca-02ba-4d0d-9e73-e7af0b94b185', '_views_market_visit_add', '新增', 46, 1, '按钮', b'1', '/market/visit/save', 'mm', b'0', b'0', '2023-01-12 08:49:22', '2023-01-12 08:49:22.000000');
+INSERT INTO `menu` VALUES (56, 'b322a5ad-cb86-4adc-a908-7b36a77377e2', '_views_market_visit_detail', '详情', 46, 2, '按钮', b'1', '/market/visit/detail', '', b'0', b'0', '2023-01-12 08:50:04', '2023-01-12 08:50:04.000000');
+INSERT INTO `menu` VALUES (57, 'e275ec08-a360-41dc-af0d-526a5637d14d', '_views_market_visit_remove', '删除', 46, 3, '按钮', b'1', '/market/visit/delete', 'gg', b'0', b'0', '2023-01-12 08:50:42', '2023-01-12 08:50:42.000000');
+INSERT INTO `menu` VALUES (58, '30be9c0f-fcdb-43ea-8a8c-2d301de6d3c5', '_views_market_index', '市场管理首页', 1, 3, '菜单', b'1', '/market/index', 'v', b'0', b'0', '2023-01-12 09:36:35', '2023-01-12 09:36:35.000000');
+INSERT INTO `menu` VALUES (59, '63240906-0df6-48e6-967b-d9a1005677ec', '_views_market_log_add', '新增', 45, 1, '按钮', b'1', '/market/log/save', '', b'0', b'0', '2023-01-13 11:11:30', '2023-01-13 11:11:30.000000');
+INSERT INTO `menu` VALUES (60, 'f1e0c44d-1dde-45a2-8e01-fa9e2c08a4f4', '_views_market_log_detail', '详情', 45, 2, '按钮', b'1', '/market/log/detail', '', b'0', b'0', '2023-01-13 11:42:36', '2023-01-13 11:42:36.000000');
+INSERT INTO `menu` VALUES (61, '7a42ea4c-f845-4af1-9551-dda0a53a7e52', '_views_market_log_remove', '删除', 45, 3, '按钮', b'1', '/market/log/delete', '', b'0', b'0', '2023-01-13 11:43:19', '2023-01-13 11:43:19.000000');
+INSERT INTO `menu` VALUES (62, '9c362eb3-87be-4f37-a4b5-1622b8e90e92', '_views_market_log_collect', '日志汇总', 41, 6, '菜单', b'1', '/market/log/collect', 'muxe', b'0', b'0', '2023-01-13 13:50:48', '2023-01-13 13:50:48.000000');
+INSERT INTO `menu` VALUES (63, '276f40cc-c070-46c7-b8bb-e494299c420e', '_views_customer_template', '模板下载', 42, 4, '按钮', b'1', '/market/customer/template', '', b'0', b'0', '2023-01-13 14:16:47', '2023-01-13 14:16:47.000000');
+INSERT INTO `menu` VALUES (64, '55aec40f-3628-4cf1-9706-575fb7060373', '_views_customer_import', '导入', 42, 5, '按钮', b'1', '/market/customer/import', '', b'0', b'0', '2023-01-13 14:17:20', '2023-01-13 14:17:20.000000');
+
+SET FOREIGN_KEY_CHECKS = 1;