Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

wxf 2 rokov pred
rodič
commit
4f40a774b0
40 zmenil súbory, kde vykonal 807 pridanie a 48 odobranie
  1. 1 0
      hx-admin/src/main/resources/application-dev.yml
  2. 2 1
      hx-admin/src/main/resources/application-prod.yml
  3. 1 0
      hx-admin/src/main/resources/application-test.yml
  4. 19 0
      hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/dto/EhsdPurchaseSelectDto.java
  5. 10 0
      hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/po/EhsdPurchase.java
  6. 4 0
      hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/vo/EhsdPurchaseVo.java
  7. 24 1
      hx-ehsd/src/main/java/com/fjhx/ehsd/service/purchase/impl/EhsdPurchaseServiceImpl.java
  8. 6 38
      hx-ehsd/src/main/resources/mapper/purchase/EhsdPurchaseMapper.xml
  9. 5 0
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  10. 44 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/work/WorkOrderBomController.java
  11. 44 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/work/WorkOrderProductionProcessesController.java
  12. 5 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractDetailsVo.java
  13. 6 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractVo.java
  14. 24 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderBomDto.java
  15. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderBomSelectDto.java
  16. 25 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderProductionProcessesDto.java
  17. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderProductionProcessesSelectDto.java
  18. 43 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/po/WorkOrderBom.java
  19. 47 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/po/WorkOrderProductionProcesses.java
  20. 30 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/vo/WorkOrderBomVo.java
  21. 30 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/work/vo/WorkOrderProductionProcessesVo.java
  22. 1 0
      hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java
  23. 22 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/work/WorkOrderBomMapper.java
  24. 21 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/work/WorkOrderProductionProcessesMapper.java
  25. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java
  26. 31 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/work/WorkOrderBomService.java
  27. 31 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/work/WorkOrderProductionProcessesService.java
  28. 91 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/work/impl/WorkOrderBomServiceImpl.java
  29. 115 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/work/impl/WorkOrderProductionProcessesServiceImpl.java
  30. 5 0
      hx-jxst/src/main/resources/mapper/work/WorkOrderBomMapper.xml
  31. 5 0
      hx-jxst/src/main/resources/mapper/work/WorkOrderProductionProcessesMapper.xml
  32. 6 0
      hx-mail/src/main/java/com/fjhx/mail/config/MailServiceConfig.java
  33. 13 1
      hx-mail/src/main/java/com/fjhx/mail/listener/LoginEventListeners.java
  34. 10 1
      hx-mail/src/main/java/com/fjhx/mail/util/MailHttpUtil.java
  35. 5 0
      hx-mes/src/main/java/com/fjhx/mes/entity/work/po/WorkOrder.java
  36. 2 1
      hx-mes/src/main/resources/mapper/work/WorkOrderMapper.xml
  37. 10 5
      hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/po/SubscribeDetail.java
  38. 5 0
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java
  39. 5 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java
  40. 8 0
      hx-sale/src/main/resources/mapper/contract/ContractMapper.xml

+ 1 - 0
hx-admin/src/main/resources/application-dev.yml

@@ -108,6 +108,7 @@ spring:
 mail:
     # 调用邮箱服务url前缀
     urlPrefix: http://localhost:8088/mailService/
+    abroadUrlPrefix:
 
 hx:
     httpUrl: http://localhost:9898/

+ 2 - 1
hx-admin/src/main/resources/application-prod.yml

@@ -100,6 +100,7 @@ server:
 mail:
     # 调用邮箱服务url前缀
     urlPrefix: http://localhost:8088/mailService/
+    abroadUrlPrefix: http://159.138.54.234:8088/mailService/
 
 hx:
-    httpUrl: http://116.205.247.33:81/prod-api/
+    httpUrl: http://139.159.251.109:81/prod-api/

+ 1 - 0
hx-admin/src/main/resources/application-test.yml

@@ -108,6 +108,7 @@ server:
 mail:
     # 调用邮箱服务url前缀
     urlPrefix: http://localhost:8088/mailService/
+    abroadUrlPrefix:
 
 hx:
     httpUrl: http://36.134.91.96:10006/test-api/

+ 19 - 0
hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/dto/EhsdPurchaseSelectDto.java

@@ -14,4 +14,23 @@ import lombok.Setter;
 @Setter
 public class EhsdPurchaseSelectDto extends BaseSelectDto {
 
+    /**
+     * 采购状态
+     */
+    private Integer purchaseStatus;
+
+    /**
+     * 到货状态
+     */
+    private Integer arrivalStatus;
+
+    /**
+     * 付款状态
+     */
+    private Integer payStatus;
+
+    /**
+     * 供应商名称
+     */
+    private String supplyName;
 }

+ 10 - 0
hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/po/EhsdPurchase.java

@@ -114,6 +114,16 @@ public class EhsdPurchase extends BasePo {
     private Integer status;
 
     /**
+     * 付款状态 0未付款  10部分付款  20已付款
+     */
+    private Integer payStatus;
+
+    /**
+     * 到货状态 0未到货  10 部分到货  20已到货
+     */
+    private Integer arrivalStatus;
+
+    /**
      * 采购总金额
      */
     private BigDecimal amount;

+ 4 - 0
hx-ehsd/src/main/java/com/fjhx/ehsd/entity/purchase/vo/EhsdPurchaseVo.java

@@ -14,4 +14,8 @@ import lombok.Setter;
 @Setter
 public class EhsdPurchaseVo extends EhsdPurchase {
 
+    /**
+     * 供应商名称
+     */
+    private String supplyName;
 }

+ 24 - 1
hx-ehsd/src/main/java/com/fjhx/ehsd/service/purchase/impl/EhsdPurchaseServiceImpl.java

@@ -1,9 +1,14 @@
 package com.fjhx.ehsd.service.purchase.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.ehsd.entity.purchase.po.EhsdPurchase;
 import com.fjhx.ehsd.mapper.purchase.EhsdPurchaseMapper;
 import com.fjhx.ehsd.service.purchase.EhsdPurchaseService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.purchase.entity.purchase.po.Purchase;
+import com.ruoyi.common.utils.wrapper.SqlField;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.ehsd.entity.purchase.vo.EhsdPurchaseVo;
@@ -22,12 +27,30 @@ import cn.hutool.core.bean.BeanUtil;
  * @since 2023-05-17
  */
 @Service
+@DS(SourceConstant.EHSD)
 public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, EhsdPurchase> implements EhsdPurchaseService {
 
+    /**
+     * 分页
+     * @param dto
+     * @return
+     */
     @Override
     public Page<EhsdPurchaseVo> getPage(EhsdPurchaseSelectDto dto) {
         IWrapper<EhsdPurchase> wrapper = getWrapper();
-        wrapper.orderByDesc("ep", EhsdPurchase::getId);
+        wrapper.orderByDesc("t1", EhsdPurchase::getCreateTime);
+        if (ObjectUtils.isNotEmpty(dto.getPurchaseStatus())) {
+            wrapper.eq("t1", EhsdPurchase::getStatus, dto.getPurchaseStatus());
+        }
+        if (ObjectUtils.isNotEmpty(dto.getArrivalStatus())) {
+            wrapper.eq("t1", EhsdPurchase::getArrivalStatus, dto.getArrivalStatus());
+        }
+        if (ObjectUtils.isNotEmpty(dto.getPayStatus())) {
+            wrapper.eq("t1", EhsdPurchase::getPayStatus, dto.getPayStatus());
+        }
+        if (ObjectUtils.isNotEmpty(dto.getKeyword())) {
+            wrapper.keyword(dto.getKeyword(),new SqlField("t2.name"),new SqlField("t1.`code`"));
+        }
         Page<EhsdPurchaseVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         return page;
     }

+ 6 - 38
hx-ehsd/src/main/resources/mapper/purchase/EhsdPurchaseMapper.xml

@@ -2,44 +2,12 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.ehsd.mapper.purchase.EhsdPurchaseMapper">
     <select id="getPage" resultType="com.fjhx.ehsd.entity.purchase.vo.EhsdPurchaseVo">
-        select
-            ep.id,
-            ep.code,
-            ep.business_id,
-            ep.business_type,
-            ep.contract_template_id,
-            ep.sell_corporation_id,
-            ep.sell_contact_name,
-            ep.sell_contact_number,
-            ep.sell_country_id,
-            ep.sell_province_id,
-            ep.sell_city_id,
-            ep.sell_address,
-            ep.buy_corporation_id,
-            ep.buy_contact_name,
-            ep.buy_contact_number,
-            ep.buy_country_id,
-            ep.buy_province_id,
-            ep.buy_city_id,
-            ep.buy_address,
-            ep.buy_postal_code,
-            ep.status,
-            ep.amount,
-            ep.remark,
-            ep.currency,
-            ep.delivery_time,
-            ep.delivery_type,
-            ep.invoice_type,
-            ep.payment_method,
-            ep.warranty,
-            ep.process_instance_id,
-            ep.approved_date,
-            ep.create_user,
-            ep.user_name,
-            ep.create_time,
-            ep.update_user,
-            ep.update_time
-        from ehsd_purchase ep
+        SELECT
+            t1.*,
+            t2.`name` AS supplyName
+        FROM
+            ehsd_purchase t1
+                LEFT JOIN bytesailing_supply.supplier_info t2 ON t1.sell_corporation_id = t2.id
             ${ew.customSqlSegment}
     </select>
 

+ 5 - 0
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -320,6 +320,11 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         if (count != 0) {
             throw new ServiceException("产品自定义编码重复");
         }
+        // 排除不为空的条码编号重复
+        long count1 = this.count(q -> q.eq(ProductInfo::getBarCode, productInfoDto.getBarCode()).ne(ProductInfo::getBarCode,""));
+        if (count1 != 0) {
+            throw new ServiceException("产品条码编码重复");
+        }
 
         this.save(productInfoDto);
         ObsFileUtil.saveFile(productInfoDto.getFileList(), productInfoDto.getId());

+ 44 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/work/WorkOrderBomController.java

@@ -0,0 +1,44 @@
+package com.fjhx.jxst.controller.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import org.springframework.web.bind.annotation.*;
+import com.fjhx.jxst.entity.work.vo.WorkOrderBomVo;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomSelectDto;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomDto;
+import com.fjhx.jxst.service.work.WorkOrderBomService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单bom 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@RestController
+@RequestMapping("/workOrderBom")
+public class WorkOrderBomController {
+
+    @Autowired
+    private WorkOrderBomService workOrderBomService;
+
+    /**
+     * 工单bom列表
+     */
+    @PostMapping("/list")
+    public List<WorkOrderBomVo> list(@RequestBody WorkOrderBom dto) {
+        return workOrderBomService.getList(dto);
+    }
+
+    /**
+     * 工单bom编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody WorkOrderBomDto workOrderBomDto) {
+        workOrderBomService.edit(workOrderBomDto);
+    }
+
+}

+ 44 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/work/WorkOrderProductionProcessesController.java

@@ -0,0 +1,44 @@
+package com.fjhx.jxst.controller.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import org.springframework.web.bind.annotation.*;
+import com.fjhx.jxst.entity.work.vo.WorkOrderProductionProcessesVo;
+import com.fjhx.jxst.entity.work.dto.WorkOrderProductionProcessesSelectDto;
+import com.fjhx.jxst.entity.work.dto.WorkOrderProductionProcessesDto;
+import com.fjhx.jxst.service.work.WorkOrderProductionProcessesService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单工序 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@RestController
+@RequestMapping("/workOrderProductionProcesses")
+public class WorkOrderProductionProcessesController {
+
+    @Autowired
+    private WorkOrderProductionProcessesService workOrderProductionProcessesService;
+
+    /**
+     * 工单工序列表
+     */
+    @PostMapping("/list")
+    public List<WorkOrderProductionProcessesVo> list(@RequestBody WorkOrderProductionProcesses dto) {
+        return workOrderProductionProcessesService.getList(dto);
+    }
+
+    /**
+     * 工单工序编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody WorkOrderProductionProcessesDto workOrderProductionProcessesDto) {
+        workOrderProductionProcessesService.edit(workOrderProductionProcessesDto);
+    }
+
+}

+ 5 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractDetailsVo.java

@@ -14,4 +14,9 @@ import lombok.Setter;
 @Setter
 public class SalesContractDetailsVo extends SalesContractDetails {
 
+    /**
+     * 产品名称
+     */
+    private String productName;
+
 }

+ 6 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractVo.java

@@ -5,6 +5,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 销售合同列表查询返回值实体
@@ -21,4 +22,9 @@ public class SalesContractVo extends SalesContract {
      */
     private String customerName;
 
+    /**
+     * 销售合同明细
+     */
+    private List<SalesContractDetailsVo> contractDetailsList;
+
 }

+ 24 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderBomDto.java

@@ -0,0 +1,24 @@
+package com.fjhx.jxst.entity.work.dto;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 工单bom新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderBomDto extends WorkOrderBom {
+
+    /**
+     * 定制bom列表
+     */
+    List<WorkOrderBom> workOrderBomList;
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderBomSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.work.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 工单bom列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderBomSelectDto extends BaseSelectDto {
+
+}

+ 25 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderProductionProcessesDto.java

@@ -0,0 +1,25 @@
+package com.fjhx.jxst.entity.work.dto;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import com.fjhx.jxst.entity.work.vo.WorkOrderProductionProcessesVo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 工单工序新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderProductionProcessesDto extends WorkOrderProductionProcesses {
+
+    /**
+     * 工序列表
+     */
+    List<WorkOrderProductionProcessesVo> workOrderProductionProcessesList;
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/dto/WorkOrderProductionProcessesSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.work.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 工单工序列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderProductionProcessesSelectDto extends BaseSelectDto {
+
+}

+ 43 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/po/WorkOrderBom.java

@@ -0,0 +1,43 @@
+package com.fjhx.jxst.entity.work.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 工单bom
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+@TableName("work_order_bom")
+public class WorkOrderBom extends BasePo {
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 成本
+     */
+    private BigDecimal cost;
+
+}

+ 47 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/po/WorkOrderProductionProcesses.java

@@ -0,0 +1,47 @@
+package com.fjhx.jxst.entity.work.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 工单工序
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+@TableName("work_order_production_processes")
+public class WorkOrderProductionProcesses extends BasePo {
+
+    /**
+     * 工单id
+     */
+    private Long workOrderId;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 工序名称
+     */
+    private String name;
+
+    /**
+     * 工序说明
+     */
+    private String remarks;
+
+    /**
+     * 工序文件名
+     */
+    private String fileName;
+
+}

+ 30 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/vo/WorkOrderBomVo.java

@@ -0,0 +1,30 @@
+package com.fjhx.jxst.entity.work.vo;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 工单bom列表查询返回值实体
+ *
+ * @author
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderBomVo extends WorkOrderBom {
+
+    /**
+     * 产品编号
+     */
+    private String productCode;
+    /**
+     * 产品单位
+     */
+    private String productUnit;
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+}

+ 30 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/work/vo/WorkOrderProductionProcessesVo.java

@@ -0,0 +1,30 @@
+package com.fjhx.jxst.entity.work.vo;
+
+import com.fjhx.file.entity.ObsFile;
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 工单工序列表查询返回值实体
+ *
+ * @author
+ * @since 2023-05-17
+ */
+@Getter
+@Setter
+public class WorkOrderProductionProcessesVo extends WorkOrderProductionProcesses {
+
+    /**
+     * 附件列表
+     */
+    private List<ObsFile> fileList;
+
+    /**
+     * 带过来的工序id
+     */
+    private Long oldId;
+
+}

+ 1 - 0
hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java

@@ -47,6 +47,7 @@ public class SalesContractFlow extends FlowDelegate {
             workOrder.setSource("sales_contract");//销售合同
             workOrder.setProductId(salesContractDetails.getProductId());
             workOrder.setQuantity(salesContractDetails.getQuantity());
+            workOrder.setIsCustomized(salesContractDetails.getIsCustomized());
             //添加工单
             workOrderService.add(workOrder);
         }

+ 22 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/work/WorkOrderBomMapper.java

@@ -0,0 +1,22 @@
+package com.fjhx.jxst.mapper.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.jxst.entity.work.vo.WorkOrderBomVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单bom Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+public interface WorkOrderBomMapper extends BaseMapper<WorkOrderBom> {
+
+
+}

+ 21 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/work/WorkOrderProductionProcessesMapper.java

@@ -0,0 +1,21 @@
+package com.fjhx.jxst.mapper.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.jxst.entity.work.vo.WorkOrderProductionProcessesVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单工序 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+public interface WorkOrderProductionProcessesMapper extends BaseMapper<WorkOrderProductionProcesses> {
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java

@@ -6,20 +6,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
 import com.fjhx.jxst.entity.sales.dto.SalesContractSelectDto;
 import com.fjhx.jxst.entity.sales.po.SalesContract;
 import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.jxst.entity.sales.vo.SalesContractDetailsVo;
 import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
 import com.fjhx.jxst.mapper.sales.SalesContractMapper;
 import com.fjhx.jxst.service.sales.SalesContractDetailsService;
 import com.fjhx.jxst.service.sales.SalesContractService;
+import com.fjhx.wms.entity.stock.vo.StockVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -39,6 +43,8 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
     private SalesContractDetailsService salesContractDetailsService;
     @Autowired
     private CustomerService customerService;
+    @Autowired
+    private ProductInfoService productInfoService;
 
     @Override
     public Page<SalesContractVo> getPage(SalesContractSelectDto dto) {
@@ -66,6 +72,17 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
     public SalesContractVo detail(Long id) {
         SalesContract SalesContract = this.getById(id);
         SalesContractVo result = BeanUtil.toBean(SalesContract, SalesContractVo.class);
+        List<SalesContractDetails> salesContractDetailsList = salesContractDetailsService.list(q -> q.eq(SalesContractDetails::getSalesContractId, result.getId()));
+        List<SalesContractDetailsVo> salesContractDetailsVos = BeanUtil.copyToList(salesContractDetailsList, SalesContractDetailsVo.class);
+        //赋值产品信息
+        productInfoService.attributeAssign(salesContractDetailsVos, SalesContractDetailsVo::getProductId, (item, productInfo) -> {
+            item.setProductName(productInfo.getName());
+        });
+        result.setContractDetailsList(salesContractDetailsVos);
+        //赋值客户名称
+        customerService.attributeAssign(Arrays.asList(result), SalesContractVo::getCustomerId, (item, customer) -> {
+            item.setCustomerName(customer.getName());
+        });
         return result;
     }
 

+ 31 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/work/WorkOrderBomService.java

@@ -0,0 +1,31 @@
+package com.fjhx.jxst.service.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import com.ruoyi.common.core.service.BaseService;
+import com.fjhx.jxst.entity.work.vo.WorkOrderBomVo;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomSelectDto;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomDto;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单bom 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+public interface WorkOrderBomService extends BaseService<WorkOrderBom> {
+
+    /**
+     * 工单bom列表
+     */
+    List<WorkOrderBomVo> getList(WorkOrderBom dto);
+
+    /**
+     * 工单bom编辑
+     */
+    void edit(WorkOrderBomDto workOrderBomDto);
+
+}

+ 31 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/work/WorkOrderProductionProcessesService.java

@@ -0,0 +1,31 @@
+package com.fjhx.jxst.service.work;
+
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import com.ruoyi.common.core.service.BaseService;
+import com.fjhx.jxst.entity.work.vo.WorkOrderProductionProcessesVo;
+import com.fjhx.jxst.entity.work.dto.WorkOrderProductionProcessesSelectDto;
+import com.fjhx.jxst.entity.work.dto.WorkOrderProductionProcessesDto;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单工序 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+public interface WorkOrderProductionProcessesService extends BaseService<WorkOrderProductionProcesses> {
+
+    /**
+     * 工单工序列表
+     */
+    List<WorkOrderProductionProcessesVo> getList(WorkOrderProductionProcesses dto);
+
+    /**
+     * 工单工序编辑
+     */
+    void edit(WorkOrderProductionProcessesDto workOrderProductionProcessesDto);
+
+}

+ 91 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/work/impl/WorkOrderBomServiceImpl.java

@@ -0,0 +1,91 @@
+package com.fjhx.jxst.service.work.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.jxst.entity.work.po.WorkOrderBom;
+import com.fjhx.jxst.mapper.work.WorkOrderBomMapper;
+import com.fjhx.jxst.service.work.WorkOrderBomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
+import com.fjhx.mes.entity.work.po.WorkOrder;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
+import com.fjhx.mes.service.work.WorkOrderService;
+import com.fjhx.purchase.entity.arrival.po.ArrivalDetail;
+import com.obs.services.internal.ServiceException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fjhx.jxst.entity.work.vo.WorkOrderBomVo;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.fjhx.jxst.entity.work.dto.WorkOrderBomDto;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单bom 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-17
+ */
+@Service
+public class WorkOrderBomServiceImpl extends ServiceImpl<WorkOrderBomMapper, WorkOrderBom> implements WorkOrderBomService {
+
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private WorkOrderService workOrderService;
+    @Autowired
+    private ProductInfoService productInfoService;
+
+    @Override
+    public List<WorkOrderBomVo> getList(WorkOrderBom dto) {
+        WorkOrder workOrder = workOrderService.getById(dto.getWorkOrderId());
+        if(ObjectUtil.isEmpty(workOrder)){
+            throw new ServiceException("查询不到工单信息");
+        }
+        List<WorkOrderBom> workOrderBomList = list(q -> q.eq(WorkOrderBom::getWorkOrderId, dto.getWorkOrderId()));
+        if(ObjectUtil.isEmpty(workOrderBomList)){
+            //如果不存在定制BOM就查询基本BOM信息
+            BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrder.getProductId()));
+            if(ObjectUtil.isEmpty(bomInfo)){
+                throw new ServiceException("查询不到产品基本BOM信息");
+            }
+            List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+            if(ObjectUtil.isEmpty(bomDetailList)){
+                throw new ServiceException("查询不到产品基本BOM明细信息");
+            }
+            workOrderBomList = BeanUtil.copyToList(bomDetailList, WorkOrderBom.class);
+            for (WorkOrderBom workOrderBomVo : workOrderBomList) {
+                workOrderBomVo.setId(null);//清空id
+            }
+        }
+        List<WorkOrderBomVo> workOrderBomVos = BeanUtil.copyToList(workOrderBomList, WorkOrderBomVo.class);
+        //赋值产品明细
+        productInfoService.attributeAssign(workOrderBomVos, WorkOrderBomVo::getProductId, (item, productInfo) -> {
+            item.setProductCode(productInfo.getCode());
+            item.setProductUnit(productInfo.getUnit());
+            item.setProductName(productInfo.getName());
+        });
+        return workOrderBomVos;
+    }
+
+    @DSTransactional
+    @Override
+    public void edit(WorkOrderBomDto workOrderBomDto) {
+//        this.updateById(workOrderBomDto);
+
+        List<WorkOrderBom> afterSaleDetailList = workOrderBomDto.getWorkOrderBomList();
+        afterSaleDetailList.forEach(item -> item.setWorkOrderId(workOrderBomDto.getWorkOrderId()));
+        this.editLinked(afterSaleDetailList, WorkOrderBom::getWorkOrderId, workOrderBomDto.getWorkOrderId());
+
+    }
+
+}

+ 115 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/work/impl/WorkOrderProductionProcessesServiceImpl.java

@@ -0,0 +1,115 @@
+package com.fjhx.jxst.service.work.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.file.entity.ObsFile;
+import com.fjhx.file.utils.ObsFileUtil;
+import com.fjhx.jxst.entity.work.dto.WorkOrderProductionProcessesDto;
+import com.fjhx.jxst.entity.work.po.WorkOrderProductionProcesses;
+import com.fjhx.jxst.entity.work.vo.WorkOrderProductionProcessesVo;
+import com.fjhx.jxst.mapper.work.WorkOrderProductionProcessesMapper;
+import com.fjhx.jxst.service.work.WorkOrderProductionProcessesService;
+import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
+import com.fjhx.mes.entity.production.po.ProductionProcesses;
+import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.work.po.WorkOrder;
+import com.fjhx.mes.service.applicable.ApplicableProductsService;
+import com.fjhx.mes.service.production.ProductionProcessesService;
+import com.fjhx.mes.service.technology.TechnologyService;
+import com.fjhx.mes.service.work.WorkOrderService;
+import com.obs.services.internal.ServiceException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 工单工序 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-05-17
+ */
+@Service
+public class WorkOrderProductionProcessesServiceImpl extends ServiceImpl<WorkOrderProductionProcessesMapper, WorkOrderProductionProcesses> implements WorkOrderProductionProcessesService {
+
+    @Autowired
+    private TechnologyService technologyService;
+    @Autowired
+    private ApplicableProductsService applicableProductsService;
+    @Autowired
+    private WorkOrderService workOrderService;
+    @Autowired
+    private ProductionProcessesService productionProcessesService;
+
+    @Override
+    public List<WorkOrderProductionProcessesVo> getList(WorkOrderProductionProcesses dto) {
+        WorkOrder workOrder = workOrderService.getById(dto.getWorkOrderId());
+        if (ObjectUtil.isEmpty(workOrder)) {
+            throw new ServiceException("查询不到工单信息");
+        }
+        List<WorkOrderProductionProcesses> workOrderProductionProcessesList = list(q -> q
+                .eq(WorkOrderProductionProcesses::getWorkOrderId, dto.getWorkOrderId())
+                .orderByAsc(WorkOrderProductionProcesses::getSort));
+        //如果定制工序信息为空就获取基础工艺工序信息
+        if (ObjectUtil.isEmpty(workOrderProductionProcessesList)) {
+            ApplicableProducts applicableProducts = applicableProductsService.getOne(q -> q.eq(ApplicableProducts::getProductId, workOrder.getProductId()));
+            if (ObjectUtil.isEmpty(applicableProducts)) {
+                throw new ServiceException("未找到适用于该产品的工艺信息");
+            }
+            Technology technology = technologyService.getById(applicableProducts.getTechnologyId());
+            if (ObjectUtil.isEmpty(technology)) {
+                throw new ServiceException("工艺信息不存在");
+            }
+            String processRoute = technology.getProcessRoute();
+            if (ObjectUtil.isEmpty(processRoute)) {
+                throw new ServiceException("工艺线路为空");
+            }
+            String[] split = processRoute.split(",");
+            List<ProductionProcesses> productionProcesses = productionProcessesService.list(q -> q.in(ProductionProcesses::getId, split));
+            List<WorkOrderProductionProcessesVo> workOrderProductionProcessesList0 = BeanUtil.copyToList(productionProcesses, WorkOrderProductionProcessesVo.class);
+            int i = 0;
+            for (WorkOrderProductionProcessesVo workOrderProductionProcesses : workOrderProductionProcessesList0) {
+                workOrderProductionProcesses.setOldId(workOrderProductionProcesses.getId());//赋值带过来的id
+                workOrderProductionProcesses.setId(null);
+                workOrderProductionProcesses.setSort(i);
+                i++;
+            }
+            return workOrderProductionProcessesList0;
+        }
+        List<WorkOrderProductionProcessesVo> workOrderProductionProcessesVos = BeanUtil.copyToList(workOrderProductionProcessesList, WorkOrderProductionProcessesVo.class);
+        return workOrderProductionProcessesVos;
+    }
+
+    @DSTransactional
+    @Override
+    public void edit(WorkOrderProductionProcessesDto workOrderProductionProcessesDto) {
+//        this.updateById(workOrderProductionProcessesDto);
+
+        List<WorkOrderProductionProcessesVo> workOrderProductionProcessesList = workOrderProductionProcessesDto.getWorkOrderProductionProcessesList();
+
+        int i = 0;
+        for (WorkOrderProductionProcessesVo workOrderProductionProcesses : workOrderProductionProcessesList) {
+            workOrderProductionProcesses.setWorkOrderId(workOrderProductionProcessesDto.getWorkOrderId());
+            workOrderProductionProcesses.setSort(i);
+            List<ObsFile> fileList = workOrderProductionProcesses.getFileList();
+            if (ObjectUtil.isNotEmpty(fileList)) {
+                workOrderProductionProcesses.setFileName(fileList.get(0).getFileName());
+            }
+            i++;
+
+            //处理附件信息
+            if (ObjectUtil.isEmpty(workOrderProductionProcesses.getId())) {
+                ObsFileUtil.saveFile(workOrderProductionProcesses.getFileList(), workOrderProductionProcesses.getId());
+            } else {
+                ObsFileUtil.editFile(workOrderProductionProcesses.getFileList(), workOrderProductionProcesses.getId());
+            }
+        }
+        List<WorkOrderProductionProcesses> workOrderProductionProcessesList1 = BeanUtil.copyToList(workOrderProductionProcessesList, WorkOrderProductionProcesses.class);
+        this.editLinked(workOrderProductionProcessesList1, WorkOrderProductionProcesses::getWorkOrderId, workOrderProductionProcessesDto.getWorkOrderId());
+    }
+
+}

+ 5 - 0
hx-jxst/src/main/resources/mapper/work/WorkOrderBomMapper.xml

@@ -0,0 +1,5 @@
+<?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.fjhx.jxst.mapper.work.WorkOrderBomMapper">
+
+</mapper>

+ 5 - 0
hx-jxst/src/main/resources/mapper/work/WorkOrderProductionProcessesMapper.xml

@@ -0,0 +1,5 @@
+<?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.fjhx.jxst.mapper.work.WorkOrderProductionProcessesMapper">
+
+</mapper>

+ 6 - 0
hx-mail/src/main/java/com/fjhx/mail/config/MailServiceConfig.java

@@ -12,9 +12,15 @@ public class MailServiceConfig {
      */
     public static String urlPrefix;
 
+    public static String abroadUrlPrefix;
+
     @Value("${mail.urlPrefix}")
     public void setUrlPrefix(String urlPrefix) {
         MailServiceConfig.urlPrefix = urlPrefix;
     }
 
+    @Value("${mail.abroadUrlPrefix}")
+    public void setAbroadUserUrlPrefix(String abroadUserUrlPrefix) {
+        MailServiceConfig.abroadUrlPrefix = abroadUserUrlPrefix;
+    }
 }

+ 13 - 1
hx-mail/src/main/java/com/fjhx/mail/listener/LoginEventListeners.java

@@ -23,7 +23,6 @@ public class LoginEventListeners {
     public void loginEvent(LoginEvent loginEvent) {
         threadPoolExecutor.execute(() -> {
             Long userId = (Long) loginEvent.getSource();
-
             int num = 0;
             while (num < 3) {
                 try {
@@ -34,7 +33,20 @@ public class LoginEventListeners {
                     num++;
                 }
             }
+        });
 
+        threadPoolExecutor.execute(() -> {
+            Long userId = (Long) loginEvent.getSource();
+            int num = 0;
+            while (num < 3) {
+                try {
+                    MailHttpUtil.abroadUserLogin(userId);
+                    num = 3;
+                } catch (Exception e) {
+                    log.error("同步邮件服务用户登录失败", e);
+                    num++;
+                }
+            }
         });
     }
 

+ 10 - 1
hx-mail/src/main/java/com/fjhx/mail/util/MailHttpUtil.java

@@ -1,12 +1,21 @@
 package com.fjhx.mail.util;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import com.fjhx.mail.config.MailServiceConfig;
 
 public class MailHttpUtil {
 
     public static void userLogin(Long userId) {
-        HttpUtil.get(MailServiceConfig.urlPrefix + "userLogin/" + userId);
+        if (StrUtil.isNotBlank(MailServiceConfig.urlPrefix)) {
+            HttpUtil.get(MailServiceConfig.urlPrefix + "userLogin/" + userId);
+        }
+    }
+
+    public static void abroadUserLogin(Long userId) {
+        if (StrUtil.isNotBlank(MailServiceConfig.abroadUrlPrefix)) {
+            HttpUtil.get(MailServiceConfig.abroadUrlPrefix + "userLogin/" + userId);
+        }
     }
 
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/work/po/WorkOrder.java

@@ -57,4 +57,9 @@ public class WorkOrder extends BasePo {
      */
     private Integer status;
 
+    /**
+     * 是否定制
+     */
+    private String isCustomized;
+
 }

+ 2 - 1
hx-mes/src/main/resources/mapper/work/WorkOrderMapper.xml

@@ -13,7 +13,8 @@
             wo.create_user,
             wo.create_time,
             wo.update_user,
-            wo.update_time
+            wo.update_time,
+            wo.is_customized
         from work_order wo
             ${ew.customSqlSegment}
     </select>

+ 10 - 5
hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/po/SubscribeDetail.java

@@ -1,20 +1,19 @@
 package com.fjhx.purchase.entity.subscribe.po;
 
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.ruoyi.common.core.domain.BasePo;
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.math.BigDecimal;
-import java.util.Date;
+import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 申购单
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-03
  */
 @Getter
@@ -92,4 +91,10 @@ public class SubscribeDetail extends BasePo {
      */
     @TableField(exist = false)
     private String productSpec;
+
+    /**
+     * 部门id
+     */
+    @TableField(exist = false)
+    private Long deptId;
 }

+ 5 - 0
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java

@@ -169,6 +169,11 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
                     s.setProductType(p.getType());
                     s.setProductName(p.getName());
                     s.setProductSpec(p.getSpec());
+
+                    //维多利亚赋值部门id
+                    String victoriatouristJson = p.getVictoriatouristJson();
+                    JSONObject json = ObjectUtil.isNotEmpty(victoriatouristJson) ? JSONObject.parseObject(victoriatouristJson) : new JSONObject();
+                    s.setDeptId(json.getLong("deptId"));
                 }
             }
         }

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java

@@ -253,6 +253,11 @@ public class Contract extends BasePo {
     private String beneficiaryAccountNumber;
 
     /**
+     * 利润预算表备注
+     */
+    private String budgetRemark;
+
+    /**
      * 版本号
      */
     @TableField(fill = FieldFill.INSERT)

+ 8 - 0
hx-sale/src/main/resources/mapper/contract/ContractMapper.xml

@@ -10,6 +10,14 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="getProfitBudgetPage" resultType="com.fjhx.sale.entity.contract.vo.ContractVo">
+        SELECT
+            t1.*
+        FROM
+            contract t1
+        ${ew.customSqlSegment}
+    </select>
+
     <select id="getNoPackContractByCustomerId" resultType="com.fjhx.sale.entity.contract.vo.ContractVo">
         SELECT
             *