瀏覽代碼

添加海运价后端文件,优化仓库 实际录入明细问题

阿伏兔 4 年之前
父節點
當前提交
56335378fe
共有 21 個文件被更改,包括 1985 次插入62 次删除
  1. 190 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/quotation/TSeapriceController.java
  2. 12 5
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/warehouseBusiness/AppletsController.java
  3. 13 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/warehouseBusiness/TWarehouseInStockController.java
  4. 11 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  5. 20 17
      ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
  6. 1 1
      ruoyi-warehouse/src/main/java/com/ruoyi/basicData/service/impl/TCorpsServiceImpl.java
  7. 8 0
      ruoyi-warehouse/src/main/java/com/ruoyi/finance/service/impl/TFeeServiceImpl.java
  8. 248 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/domain/TSeaprice.java
  9. 225 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/domain/TSeapriceitem.java
  10. 100 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/mapper/TSeapriceMapper.java
  11. 62 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/mapper/TSeapriceitemMapper.java
  12. 91 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/service/ITSeapriceService.java
  13. 408 0
      ruoyi-warehouse/src/main/java/com/ruoyi/quotation/service/impl/TSeapriceServiceImpl.java
  14. 2 0
      ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/mapper/TWarehousebillsitemsMapper.java
  15. 7 0
      ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/ITWarehouseBillsService.java
  16. 2 0
      ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/impl/TWarehouseAgreementServiceImpl.java
  17. 221 33
      ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/impl/TWarehouseBillsServiceImpl.java
  18. 4 4
      ruoyi-warehouse/src/main/resources/mapper/finance/TFeeMapper.xml
  19. 210 0
      ruoyi-warehouse/src/main/resources/mapper/quotation/TSeapriceMapper.xml
  20. 136 0
      ruoyi-warehouse/src/main/resources/mapper/quotation/TSeapriceitemMapper.xml
  21. 14 0
      ruoyi-warehouse/src/main/resources/mapper/warehouseBusiness/TWarehousebillsitemsMapper.xml

+ 190 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/quotation/TSeapriceController.java

@@ -0,0 +1,190 @@
+package com.ruoyi.web.controller.warehouse.quotation;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.quotation.domain.TSeaprice;
+import com.ruoyi.quotation.service.ITSeapriceService;
+import com.ruoyi.system.domain.SysCheckCode;
+import com.ruoyi.warehouseBusiness.service.ITWarehouseBillsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海运价主Controller
+ * 报价
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+@RestController
+@RequestMapping("/warehouse/seaprice")
+public class TSeapriceController extends BaseController
+{
+    @Autowired
+    private ITSeapriceService tSeapriceService;
+
+    @Autowired
+    private ITWarehouseBillsService itWarehouseBillsService;
+
+    /**
+     * 查询单据是否允许修改
+     */
+    @GetMapping("/checkCode")
+    public boolean checkCode(SysCheckCode sysCheckCode) {
+        if (StringUtils.isNull(sysCheckCode.getfId())) {
+            return true;
+        }
+        return itWarehouseBillsService.checkCode(sysCheckCode);
+    }
+
+    /**
+     * 查询海运价主列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(TSeaprice tSeaprice)
+    {
+        startPage();
+        List<TSeaprice> list = tSeapriceService.selectTSeapriceList(tSeaprice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询海运报价列表信息
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:list')")
+    @GetMapping("/query")
+    public TableDataInfo queryItem(TSeaprice tSeaprice)
+    {
+        startPage();
+        List<Map<String, Object>> list = tSeapriceService.selectTSeapriceMapList(tSeaprice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出海运价主列表
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:export')")
+    @Log(title = "海运价主", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TSeaprice tSeaprice)
+    {
+        List<TSeaprice> list = tSeapriceService.selectTSeapriceList(tSeaprice);
+        ExcelUtil<TSeaprice> util = new ExcelUtil<TSeaprice>(TSeaprice.class);
+        return util.exportExcel(list, "seaprice");
+    }
+
+    /**
+     * 获取海运价主详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:query')")
+    @GetMapping(value = "/{fId}")
+    public AjaxResult getInfo(@PathVariable("fId") Long fId)
+    {
+        return tSeapriceService.selectTSeapriceById(fId);
+    }
+
+    /**
+     * 计算海运费
+     */
+    @RepeatSubmit
+    @GetMapping(value = "/calculateCost")
+    public AjaxResult calculateOceanFreight(TSeaprice tSeaprice)
+    {
+        if (StringUtils.isNull(tSeaprice.getfBilltype())) {
+            return AjaxResult.error("请维护业务类型");
+        }
+        if (StringUtils.isNull(tSeaprice.getfCorpid())) {
+            return AjaxResult.error("请维护船公司");
+        }
+        if (StringUtils.isNull(tSeaprice.getfSpecification())) {
+            return AjaxResult.error("请维护箱型");
+        }
+        if (StringUtils.isNull(tSeaprice.getfQty())) {
+            return AjaxResult.error("请维护箱量");
+        }
+        return tSeapriceService.calculateOceanFreight(tSeaprice);
+    }
+
+    /**
+     * 动态查询海运费、汇率
+     */
+    @GetMapping(value = "/changeSelectShippingFee")
+    public AjaxResult changeSelectShippingFee(TSeaprice tSeaprice)
+    {
+        if (StringUtils.isNull(tSeaprice.getfBilltype())) {
+            return AjaxResult.error("请维护业务类型");
+        }
+        if (StringUtils.isNull(tSeaprice.getfCorpid())) {
+            return AjaxResult.error("请维护船公司");
+        }
+        if (StringUtils.isNull(tSeaprice.getfSpecification())) {
+            return AjaxResult.error("请维护箱型");
+        }
+        return tSeapriceService.changeSelectShippingFee(tSeaprice);
+    }
+
+    /**
+     * 保存海运价主
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:add')")
+    @Log(title = "海运价主", businessType = BusinessType.INSERT)
+    @PostMapping("/saveSeaprice")
+    @RepeatSubmit
+    public AjaxResult saveSeaprice(@RequestParam("seaprice") String tSeaprice,
+                           @RequestParam("seapriceItem") String tSeapriceItem,
+                           @RequestParam("seapriceFlees") String tSeapriceFlees)
+    {
+        if (StringUtils.isEmpty(tSeaprice)) {
+            return AjaxResult.error("未找到主表信息");
+        }
+        return tSeapriceService.saveTSeaprice(tSeaprice, tSeapriceItem, tSeapriceFlees);
+    }
+
+    /**
+     * 新增海运价主
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:add')")
+    @Log(title = "海运价主", businessType = BusinessType.INSERT)
+    @PostMapping("/addSeaprice")
+    @RepeatSubmit
+    public AjaxResult add(@RequestParam("seaprice") String tSeaprice,
+                           @RequestParam("seapriceItem") String tSeapriceItem,
+                           @RequestParam("seapriceFlees") String tSeapriceFlees)
+    {
+        if (StringUtils.isEmpty(tSeaprice)) {
+            return AjaxResult.error("未找到主表信息");
+        }
+        return tSeapriceService.insertTSeaprice(tSeaprice, tSeapriceItem, tSeapriceFlees);
+    }
+
+    /**
+     * 修改海运价主
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:edit')")
+    @Log(title = "海运价主", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TSeaprice tSeaprice)
+    {
+        return toAjax(tSeapriceService.updateTSeaprice(tSeaprice));
+    }
+
+    /**
+     * 删除海运价主
+     */
+    @PreAuthorize("@ss.hasPermi('warehouse:seaprice:remove')")
+    @Log(title = "海运价主", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{fIds}")
+    public AjaxResult remove(@PathVariable Long[] fIds)
+    {
+        return toAjax(tSeapriceService.deleteTSeapriceByIds(fIds));
+    }
+}

+ 12 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/warehouseBusiness/AppletsController.java

@@ -8,15 +8,11 @@ import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.TWarehouse;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.utils.ServletUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.reportManagement.domain.TWhgenleg;
-import com.ruoyi.reportManagement.dto.TWarehousebill;
 import com.ruoyi.reportManagement.service.ITWhgenlegService;
+import com.ruoyi.system.domain.SysCheckCode;
 import com.ruoyi.warehouseBusiness.domain.TWarehouseBills;
 import com.ruoyi.warehouseBusiness.domain.TWarehousebillsitems;
 import com.ruoyi.warehouseBusiness.service.ITWarehouseBillsService;
@@ -46,6 +42,17 @@ public class AppletsController extends BaseController {
     private ITWhgenlegService tWhgenlegService;
 
     /**
+     * 查询单据是否允许修改
+     */
+    @GetMapping("/appCheckCode")
+    public AjaxResult appCheckCode(SysCheckCode sysCheckCode) {
+        if (StringUtils.isNull(sysCheckCode.getfId())) {
+            return AjaxResult.success(true);
+        }
+        return AjaxResult.success(itWarehouseBillsService.checkCode(sysCheckCode));
+    }
+
+    /**
      *  待办数
      */
     @GetMapping("/number")

+ 13 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warehouse/warehouseBusiness/TWarehouseInStockController.java

@@ -19,8 +19,8 @@ import com.ruoyi.warehouseBusiness.excel.InStock;
 import com.ruoyi.warehouseBusiness.service.ITWarehouseBillsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -86,6 +86,18 @@ public class TWarehouseInStockController extends BaseController {
     }
 
     /**
+     * 导入【入库明细箱信息】Excel
+     * 待完成
+     */
+    @PreAuthorize("@ss.hasPermi('shipping:cntrno:import')")
+    @Log(title = "导入集装箱动态", businessType = BusinessType.IMPORT)
+    @PostMapping(value = "/importInstock")
+    public AjaxResult importInstock(@RequestParam("file") MultipartFile file)
+    {
+        return itWarehouseBillsService.importLibraryInformation(file);
+    }
+
+    /**
      * 入库暂存
      */
     @PreAuthorize("@ss.hasPermi('warehouseBusiness:inStock:add')")
@@ -288,7 +300,6 @@ public class TWarehouseInStockController extends BaseController {
                 tWarehousebillsfeesCr, tWarehousebillsfeesDr, loginUser, tCntr, billsType, "1");
     }
 
-
     /**
      * 入库确认   状态 改为 -->  已入库
      * log 记录 40

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -319,4 +319,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         String timestamp = String.valueOf(date.getTime());
         return Long.valueOf(timestamp);
     }
+
+    /**
+     * 判断当前时间是否在某个时间之前
+     *
+     * @param tagDateTime 判断的标准
+     * @return true是,false不是
+     */
+    public static boolean belongCalendarBefore(Date tagDateTime) {
+        return tagDateTime.before(new Date());
+    }
+
 }

+ 20 - 17
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java

@@ -1,21 +1,5 @@
 package com.ruoyi.framework.aspectj;
 
-import java.lang.reflect.Method;
-import java.util.Map;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.Signature;
-import org.aspectj.lang.annotation.AfterReturning;
-import org.aspectj.lang.annotation.AfterThrowing;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.HandlerMapping;
 import com.alibaba.fastjson.JSON;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.model.LoginUser;
@@ -29,6 +13,23 @@ import com.ruoyi.framework.manager.AsyncManager;
 import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.domain.SysOperLog;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.HandlerMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.util.Map;
 
 /**
  * 操作日志记录处理
@@ -197,7 +198,9 @@ public class LogAspect
                 if (!isFilterObject(paramsArray[i]))
                 {
                     Object jsonObj = JSON.toJSON(paramsArray[i]);
-                    params += jsonObj.toString() + " ";
+                    if (StringUtils.isNotNull(jsonObj)) {
+                        params += jsonObj.toString() + " ";
+                    }
                 }
             }
         }

+ 1 - 1
ruoyi-warehouse/src/main/java/com/ruoyi/basicData/service/impl/TCorpsServiceImpl.java

@@ -213,7 +213,7 @@ public class TCorpsServiceImpl implements ITCorpsService {
                     SysRole role = roleMapper.selectRoleByName("外部用户");
                     if (StringUtils.isNull(role)) {
                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                        return AjaxResult.error("未找到司机角色,请创建司机角色后提交");
+                        return AjaxResult.error("未找到外部用户角色,请创建外部用户角色后提交");
                     }
                     // 创建用户与角色关联
                     List<SysUserRole> list = new ArrayList<SysUserRole>();

+ 8 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/finance/service/impl/TFeeServiceImpl.java

@@ -701,6 +701,8 @@ public class TFeeServiceImpl implements ITFeeService {
             auditItems.setAuditUserId(loginUser.getUser().getUserId());
             auditItems.setAuditItem(new Date());
             auditItems.setAuditOpTime(new Date());
+            auditItems.setFidStatus("f_billstatus");
+            auditItems.setTimes(1L);
             auditItems.setAuditMsg("提交");
             auditItems.setAuditStatus("O");
             AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
@@ -803,6 +805,8 @@ public class TFeeServiceImpl implements ITFeeService {
                 auditItems.setAuditUserId(loginUser.getUser().getUserId());
                 auditItems.setAuditItem(new Date());
                 auditItems.setAuditOpTime(new Date());
+                auditItems.setFidStatus("f_billstatus");
+                auditItems.setTimes(1L);
                 auditItems.setAuditMsg("提交");
                 auditItems.setAuditStatus("O");
                 AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
@@ -950,6 +954,8 @@ public class TFeeServiceImpl implements ITFeeService {
             auditItems.setAuditUserId(loginUser.getUser().getUserId());
             auditItems.setAuditItem(new Date());
             auditItems.setAuditOpTime(new Date());
+            auditItems.setFidStatus("f_billstatus");
+            auditItems.setTimes(1L);
             auditItems.setAuditMsg("提交");
             auditItems.setAuditStatus("O");
             AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
@@ -1376,6 +1382,8 @@ public class TFeeServiceImpl implements ITFeeService {
             auditItems.setAuditUserId(loginUser.getUser().getUserId());
             auditItems.setAuditItem(new Date());
             auditItems.setAuditOpTime(new Date());
+            auditItems.setFidStatus("f_billstatus");
+            auditItems.setTimes(1L);
             auditItems.setAuditMsg("提交");
             auditItems.setAuditStatus("O");
             AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);

+ 248 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/domain/TSeaprice.java

@@ -0,0 +1,248 @@
+package com.ruoyi.quotation.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * 海运价主对象 t_seaprice
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+public class TSeaprice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long fId;
+
+    /** 业务类型 */
+    @Excel(name = "业务类型")
+    private Long fBilltype;
+
+    /** 船公司(客户表) */
+    @Excel(name = "船公司(客户表)")
+    private Long fCorpid;
+
+    /** 起运港ID */
+    @Excel(name = "起运港ID")
+    private Long polId;
+
+    /** 目的港ID */
+    @Excel(name = "目的港ID")
+    private Long podId;
+
+    /** 有效期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "有效期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date fValiddate;
+
+    /** 校验时间戳 */
+    private String fDateChanged;
+
+    /** 状态(0有效1无效) */
+    @Excel(name = "状态(0有效1无效)")
+    private Long fBillstatus;
+
+    /** 删除状态 */
+    private String delFlag;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /** 筛选条件箱类型 */
+    private String fSpecification;
+
+    /** 箱量 */
+    private Long fQty;
+
+    /** 类型 */
+    private String fType;
+
+    /** 海运费 */
+    private BigDecimal shippingFee;
+
+    /** 汇率 */
+    private BigDecimal exrate;
+
+    /** 需要删除的规则表 */
+    private Long[] deleteItem0;
+
+    /** 需要删除的固定费用表 */
+    private Long[] deleteItem1;
+
+    public void setfId(Long fId) 
+    {
+        this.fId = fId;
+    }
+
+    public Long getfId() 
+    {
+        return fId;
+    }
+    public void setfBilltype(Long fBilltype) 
+    {
+        this.fBilltype = fBilltype;
+    }
+
+    public Long getfBilltype() 
+    {
+        return fBilltype;
+    }
+    public void setfCorpid(Long fCorpid) 
+    {
+        this.fCorpid = fCorpid;
+    }
+
+    public Long getfCorpid() 
+    {
+        return fCorpid;
+    }
+    public void setPolId(Long polId) 
+    {
+        this.polId = polId;
+    }
+
+    public Long getPolId() 
+    {
+        return polId;
+    }
+    public void setPodId(Long podId) 
+    {
+        this.podId = podId;
+    }
+
+    public Long getPodId() 
+    {
+        return podId;
+    }
+    public void setfValiddate(Date fValiddate) 
+    {
+        this.fValiddate = fValiddate;
+    }
+
+    public Date getfValiddate() 
+    {
+        return fValiddate;
+    }
+    public void setfBillstatus(Long fBillstatus)
+    {
+        this.fBillstatus = fBillstatus;
+    }
+
+    public Long getfBillstatus()
+    {
+        return fBillstatus;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setRemarks(String remarks) 
+    {
+        this.remarks = remarks;
+    }
+
+    public String getRemarks() 
+    {
+        return remarks;
+    }
+
+    public Long[] getDeleteItem0() {
+        return deleteItem0;
+    }
+
+    public void setDeleteItem0(Long[] deleteItem0) {
+        this.deleteItem0 = deleteItem0;
+    }
+
+    public Long[] getDeleteItem1() {
+        return deleteItem1;
+    }
+
+    public void setDeleteItem1(Long[] deleteItem1) {
+        this.deleteItem1 = deleteItem1;
+    }
+
+    public String getfSpecification() {
+        return fSpecification;
+    }
+
+    public void setfSpecification(String fSpecification) {
+        this.fSpecification = fSpecification;
+    }
+
+    public Long getfQty() {
+        return fQty;
+    }
+
+    public void setfQty(Long fQty) {
+        this.fQty = fQty;
+    }
+
+    public BigDecimal getShippingFee() {
+        return shippingFee;
+    }
+
+    public void setShippingFee(BigDecimal shippingFee) {
+        this.shippingFee = shippingFee;
+    }
+
+    public BigDecimal getExrate() {
+        return exrate;
+    }
+
+    public void setExrate(BigDecimal exrate) {
+        this.exrate = exrate;
+    }
+
+    public String getfType() {
+        return fType;
+    }
+
+    public void setfType(String fType) {
+        this.fType = fType;
+    }
+
+    public String getfDateChanged() {
+        return fDateChanged;
+    }
+
+    public void setfDateChanged(String fDateChanged) {
+        this.fDateChanged = fDateChanged;
+    }
+
+    @Override
+    public String toString() {
+        return "TSeaprice{" +
+                "fId=" + fId +
+                ", fBilltype=" + fBilltype +
+                ", fCorpid=" + fCorpid +
+                ", polId=" + polId +
+                ", podId=" + podId +
+                ", fValiddate=" + fValiddate +
+                ", fDateChanged='" + fDateChanged + '\'' +
+                ", fBillstatus=" + fBillstatus +
+                ", delFlag='" + delFlag + '\'' +
+                ", remarks='" + remarks + '\'' +
+                ", fSpecification='" + fSpecification + '\'' +
+                ", fQty=" + fQty +
+                ", fType='" + fType + '\'' +
+                ", shippingFee=" + shippingFee +
+                ", exrate=" + exrate +
+                ", deleteItem0=" + Arrays.toString(deleteItem0) +
+                ", deleteItem1=" + Arrays.toString(deleteItem1) +
+                '}';
+    }
+}

+ 225 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/domain/TSeapriceitem.java

@@ -0,0 +1,225 @@
+package com.ruoyi.quotation.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+/**
+ * 【请填写功能名称】对象 t_seapriceitem
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+public class TSeapriceitem extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long fId;
+
+    /** 上级id */
+    @Excel(name = "上级id")
+    private Long fPid;
+
+    /** 费用id */
+    @Excel(name = "费用id")
+    private Long fFeeid;
+
+    /** 20GP */
+    @Excel(name = "20GP")
+    private BigDecimal fSpecification1;
+
+    /** 40GP */
+    @Excel(name = "40GP")
+    private BigDecimal fSpecification2;
+
+    /** 40HC */
+    @Excel(name = "40HC")
+    private BigDecimal fSpecification3;
+
+    /** 45HC */
+    @Excel(name = "45HC")
+    private BigDecimal fSpecification4;
+
+    /** 20RH */
+    @Excel(name = "20RH")
+    private BigDecimal fSpecification5;
+
+    /** 40RH */
+    @Excel(name = "40RH")
+    private BigDecimal fSpecification6;
+
+    /** 汇率 */
+    @Excel(name = "汇率")
+    private BigDecimal fExrate;
+
+    /** 单价 */
+    @Excel(name = "单价")
+    private BigDecimal fUnitprice;
+
+    /** 类型区分0第一费用、1第二费用 */
+    @Excel(name = "类型区分0第一费用、1第二费用")
+    private String fType;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private Long fBillstatus;
+
+    /** 删除状态 */
+    private String delFlag;
+
+    public void setfId(Long fId) 
+    {
+        this.fId = fId;
+    }
+
+    public Long getfId() 
+    {
+        return fId;
+    }
+    public void setfPid(Long fPid) 
+    {
+        this.fPid = fPid;
+    }
+
+    public Long getfPid() 
+    {
+        return fPid;
+    }
+    public void setfFeeid(Long fFeeid) 
+    {
+        this.fFeeid = fFeeid;
+    }
+
+    public Long getfFeeid() 
+    {
+        return fFeeid;
+    }
+    public void setfSpecification1(BigDecimal fSpecification1) 
+    {
+        this.fSpecification1 = fSpecification1;
+    }
+
+    public BigDecimal getfSpecification1() 
+    {
+        return fSpecification1;
+    }
+    public void setfSpecification2(BigDecimal fSpecification2) 
+    {
+        this.fSpecification2 = fSpecification2;
+    }
+
+    public BigDecimal getfSpecification2() 
+    {
+        return fSpecification2;
+    }
+    public void setfSpecification3(BigDecimal fSpecification3) 
+    {
+        this.fSpecification3 = fSpecification3;
+    }
+
+    public BigDecimal getfSpecification3() 
+    {
+        return fSpecification3;
+    }
+    public void setfSpecification4(BigDecimal fSpecification4) 
+    {
+        this.fSpecification4 = fSpecification4;
+    }
+
+    public BigDecimal getfSpecification4() 
+    {
+        return fSpecification4;
+    }
+    public void setfSpecification5(BigDecimal fSpecification5) 
+    {
+        this.fSpecification5 = fSpecification5;
+    }
+
+    public BigDecimal getfSpecification5() 
+    {
+        return fSpecification5;
+    }
+    public void setfSpecification6(BigDecimal fSpecification6) 
+    {
+        this.fSpecification6 = fSpecification6;
+    }
+
+    public BigDecimal getfSpecification6() 
+    {
+        return fSpecification6;
+    }
+    public void setfExrate(BigDecimal fExrate) 
+    {
+        this.fExrate = fExrate;
+    }
+
+    public BigDecimal getfExrate() 
+    {
+        return fExrate;
+    }
+    public void setfUnitprice(BigDecimal fUnitprice) 
+    {
+        this.fUnitprice = fUnitprice;
+    }
+
+    public BigDecimal getfUnitprice() 
+    {
+        return fUnitprice;
+    }
+    public void setfType(String fType) 
+    {
+        this.fType = fType;
+    }
+
+    public String getfType() 
+    {
+        return fType;
+    }
+    public void setfBillstatus(Long fBillstatus)
+    {
+        this.fBillstatus = fBillstatus;
+    }
+
+    public Long getfBillstatus()
+    {
+        return fBillstatus;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("fId", getfId())
+            .append("fPid", getfPid())
+            .append("fFeeid", getfFeeid())
+            .append("fSpecification1", getfSpecification1())
+            .append("fSpecification2", getfSpecification2())
+            .append("fSpecification3", getfSpecification3())
+            .append("fSpecification4", getfSpecification4())
+            .append("fSpecification5", getfSpecification5())
+            .append("fSpecification6", getfSpecification6())
+            .append("fExrate", getfExrate())
+            .append("fUnitprice", getfUnitprice())
+            .append("fType", getfType())
+            .append("fBillstatus", getfBillstatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 100 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/mapper/TSeapriceMapper.java

@@ -0,0 +1,100 @@
+package com.ruoyi.quotation.mapper;
+
+import com.ruoyi.quotation.domain.TSeaprice;
+import com.ruoyi.quotation.domain.TSeapriceitem;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海运价主Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+public interface TSeapriceMapper 
+{
+    /**
+     * 查询海运价主
+     * 
+     * @param fId 海运价主ID
+     * @return 海运价主
+     */
+    public TSeaprice selectTSeapriceById(Long fId);
+
+    /**
+     * 查询海运价主列表
+     * 
+     * @param tSeaprice 海运价主
+     * @return 海运价主集合
+     */
+    public List<TSeaprice> selectTSeapriceList(TSeaprice tSeaprice);
+
+    /**
+     * 新增海运价主
+     * 
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    public int insertTSeaprice(TSeaprice tSeaprice);
+
+    /**
+     * 修改海运价主
+     * 
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    public int updateTSeaprice(TSeaprice tSeaprice);
+
+    /**
+     * 删除海运价主
+     * 
+     * @param fId 海运价主ID
+     * @return 结果
+     */
+    public int deleteTSeapriceById(Long fId);
+
+    /**
+     * 批量删除海运价主
+     * 
+     * @param fIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTSeapriceByIds(Long[] fIds);
+
+    /**
+     *  查询海运报价列表信息
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public List<Map<String, Object>> selectTSeapriceMapList(TSeaprice tSeaprice);
+
+    /**
+     * 校验是否存在相同规则
+     * @param seaprice  条件
+     * @return  结果
+     */
+    public int checkSeapriceByValiddate(TSeaprice seaprice);
+
+    /**
+     *  获取明细费用合计
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public BigDecimal selectSeapriceItemAmt(TSeaprice tSeaprice);
+
+    /**
+     *  查询计算的费用明细
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public List<TSeapriceitem> selectSeapriceItem(TSeaprice tSeaprice);
+
+    /**
+     * 动态查询海运费、汇率
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public TSeapriceitem selectShippingFee(TSeaprice tSeaprice);
+}

+ 62 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/mapper/TSeapriceitemMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.quotation.mapper;
+
+import com.ruoyi.quotation.domain.TSeapriceitem;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+public interface TSeapriceitemMapper 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param fId 【请填写功能名称】ID
+     * @return 【请填写功能名称】
+     */
+    public TSeapriceitem selectTSeapriceitemById(Long fId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param tSeapriceitem 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<TSeapriceitem> selectTSeapriceitemList(TSeapriceitem tSeapriceitem);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param tSeapriceitem 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertTSeapriceitem(TSeapriceitem tSeapriceitem);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param tSeapriceitem 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateTSeapriceitem(TSeapriceitem tSeapriceitem);
+
+    /**
+     * 删除【请填写功能名称】
+     * 
+     * @param fId 【请填写功能名称】ID
+     * @return 结果
+     */
+    public int deleteTSeapriceitemById(Long fId);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param fIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTSeapriceitemByIds(Long[] fIds);
+}

+ 91 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/service/ITSeapriceService.java

@@ -0,0 +1,91 @@
+package com.ruoyi.quotation.service;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.quotation.domain.TSeaprice;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 海运价主Service接口
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+public interface ITSeapriceService 
+{
+    /**
+     * 查询海运价主
+     * 
+     * @param fId 海运价主ID
+     * @return 海运价主
+     */
+    public AjaxResult selectTSeapriceById(Long fId);
+
+    /**
+     * 查询海运价主列表
+     * 
+     * @param tSeaprice 海运价主
+     * @return 海运价主集合
+     */
+    public List<TSeaprice> selectTSeapriceList(TSeaprice tSeaprice);
+
+    /**
+     * 保存海运价主
+     *
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    public AjaxResult saveTSeaprice(String tSeaprice, String tSeapriceItem, String tSeapriceFlees);
+
+    /**
+     * 新增海运价主
+     *
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    public AjaxResult insertTSeaprice(String tSeaprice, String tSeapriceItem, String tSeapriceFlees);
+
+    /**
+     * 修改海运价主
+     * 
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    public int updateTSeaprice(TSeaprice tSeaprice);
+
+    /**
+     * 批量删除海运价主
+     * 
+     * @param fIds 需要删除的海运价主ID
+     * @return 结果
+     */
+    public int deleteTSeapriceByIds(Long[] fIds);
+
+    /**
+     * 删除海运价主信息
+     * 
+     * @param fId 海运价主ID
+     * @return 结果
+     */
+    public int deleteTSeapriceById(Long fId);
+
+    /**
+     *  查询海运报价列表信息
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public List<Map<String, Object>> selectTSeapriceMapList(TSeaprice tSeaprice);
+
+    /**
+     * 计算海运费
+     */
+    public AjaxResult calculateOceanFreight(TSeaprice tSeaprice);
+
+    /**
+     * 动态查询海运费、汇率
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    public AjaxResult changeSelectShippingFee(TSeaprice tSeaprice);
+}

+ 408 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/quotation/service/impl/TSeapriceServiceImpl.java

@@ -0,0 +1,408 @@
+package com.ruoyi.quotation.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.quotation.domain.TSeaprice;
+import com.ruoyi.quotation.domain.TSeapriceitem;
+import com.ruoyi.quotation.mapper.TSeapriceMapper;
+import com.ruoyi.quotation.mapper.TSeapriceitemMapper;
+import com.ruoyi.quotation.service.ITSeapriceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 海运价主Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2021-06-01
+ */
+@Service
+public class TSeapriceServiceImpl implements ITSeapriceService
+{
+    @Autowired
+    private TSeapriceMapper tSeapriceMapper;
+
+    @Autowired
+    private TSeapriceitemMapper tSeapriceitemMapper;
+
+    /**
+     *  查询海运报价列表信息
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    @Override
+    public List<Map<String, Object>> selectTSeapriceMapList(TSeaprice tSeaprice) {
+        return tSeapriceMapper.selectTSeapriceMapList(tSeaprice);
+    }
+
+    /**
+     * 查询海运价主
+     * 
+     * @param fId 海运价主ID
+     * @return 海运价主
+     */
+    @Override
+    public AjaxResult selectTSeapriceById(Long fId)
+    {
+        TSeaprice tSeaprice = tSeapriceMapper.selectTSeapriceById(fId);
+        if (StringUtils.isNull(tSeaprice)) {
+            return AjaxResult.error("请确认该单据是否存在");
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("seaprice", tSeaprice);
+        TSeapriceitem tSeapriceitem = new TSeapriceitem();
+        tSeapriceitem.setfPid(fId);
+        tSeapriceitem.setfType("0");
+        map.put("seapriceItem", tSeapriceitemMapper.selectTSeapriceitemList(tSeapriceitem));
+        tSeapriceitem.setfType("1");
+        map.put("seapriceFees", tSeapriceitemMapper.selectTSeapriceitemList(tSeapriceitem));
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 查询海运价主列表
+     * 
+     * @param tSeaprice 海运价主
+     * @return 海运价主
+     */
+    @Override
+    public List<TSeaprice> selectTSeapriceList(TSeaprice tSeaprice)
+    {
+        return tSeapriceMapper.selectTSeapriceList(tSeaprice);
+    }
+
+    /**
+     * 保存海运价主
+     *
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public AjaxResult saveTSeaprice(String tSeaprice, String tSeapriceItem, String tSeapriceFlees) {
+        TSeaprice seaprice = JSONArray.parseObject(tSeaprice, TSeaprice.class);
+        // 校验必填项
+        AjaxResult ajaxResult = checkSeaprice(seaprice);
+        String code = ajaxResult.get("code").toString();
+        if ("500".equals(code)) {
+            return ajaxResult;
+        }
+        // 校验是否存在相同规则
+        if (tSeapriceMapper.checkSeapriceByValiddate(seaprice) != 0) {
+            return AjaxResult.error("该海运价规则已存在");
+        }
+        Long fId = 0L;
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        seaprice.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        if (StringUtils.isNotNull(seaprice.getfId())) {
+            if (StringUtils.isNotNull(seaprice.getDeleteItem0())) {
+                tSeapriceitemMapper.deleteTSeapriceitemByIds(seaprice.getDeleteItem0());
+            }
+            if (StringUtils.isNotNull(seaprice.getDeleteItem1())) {
+                tSeapriceitemMapper.deleteTSeapriceitemByIds(seaprice.getDeleteItem1());
+            }
+            seaprice.setUpdateTime(new Date());
+            seaprice.setUpdateBy(SecurityUtils.getUsername());
+            tSeapriceMapper.updateTSeaprice(seaprice);
+            fId = seaprice.getfId();
+        } else {
+            seaprice.setCreateTime(new Date());
+            seaprice.setCreateBy(SecurityUtils.getUsername());
+            tSeapriceMapper.insertTSeaprice(seaprice);
+            fId = seaprice.getfId();
+        }
+        if (StringUtils.isNotEmpty(tSeapriceItem) && !"[]".equalsIgnoreCase(tSeapriceItem)) {
+            JSONArray parseArray = JSONArray.parseArray(tSeapriceItem);
+            List<TSeapriceitem> tSeapriceitems = JSONObject.parseArray(parseArray.toJSONString(), TSeapriceitem.class);
+            // 校验必填项
+            AjaxResult result = checkSeapriceItem(tSeapriceitems, "0");
+            if ("500".equals(result.get("code").toString())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+            // 校验是否存在重复费用id
+            List<Long> collect = tSeapriceitems.stream().map(TSeapriceitem::getfFeeid).collect(Collectors.toList());
+            long count = collect.stream().distinct().count();
+            if (collect.size() != count) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return AjaxResult.error("海运费中存在重复费用,请确认");
+            }
+            insertOrUpdateItem(tSeapriceitems, fId, "0");
+            String itemCode = ajaxResult.get("code").toString();
+            if ("500".equals(itemCode)) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+        }
+        if (StringUtils.isNotEmpty(tSeapriceFlees) && !"[]".equalsIgnoreCase(tSeapriceFlees)) {
+            JSONArray parseArray = JSONArray.parseArray(tSeapriceFlees);
+            List<TSeapriceitem> tSeapriceitems = JSONObject.parseArray(parseArray.toJSONString(), TSeapriceitem.class);
+            // 校验必填项
+            AjaxResult result = checkSeapriceItem(tSeapriceitems, "1");
+            if ("500".equals(result.get("code").toString())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+            // 校验是否存在重复费用id
+            List<Long> collect = tSeapriceitems.stream().map(TSeapriceitem::getfFeeid).collect(Collectors.toList());
+            long count = collect.stream().distinct().count();
+            if (collect.size() != count) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return AjaxResult.error("杂费表中存在重复费用,请确认");
+            }
+            insertOrUpdateItem(tSeapriceitems, fId, "1");
+            String itemCode = ajaxResult.get("code").toString();
+            if ("500".equals(itemCode)) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+        }
+        return AjaxResult.success(seaprice);
+    }
+
+    /**
+     * 新增海运价主
+     *
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public AjaxResult insertTSeaprice(String tSeaprice, String tSeapriceItem, String tSeapriceFlees) {
+        TSeaprice seaprice = JSONArray.parseObject(tSeaprice, TSeaprice.class);
+        // 校验必填项
+        AjaxResult ajaxResult = checkSeaprice(seaprice);
+        String code = ajaxResult.get("code").toString();
+        if ("500".equals(code)) {
+            return ajaxResult;
+        }
+        // 校验是否存在相同规则
+        if (tSeapriceMapper.checkSeapriceByValiddate(seaprice) != 0) {
+            return AjaxResult.error("该海运价规则已存在");
+        }
+        Long fId = 0L;
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        seaprice.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        if (StringUtils.isNotNull(seaprice.getfId())) {
+            tSeapriceitemMapper.deleteTSeapriceitemByIds(seaprice.getDeleteItem0());
+            tSeapriceitemMapper.deleteTSeapriceitemByIds(seaprice.getDeleteItem1());
+            seaprice.setUpdateTime(new Date());
+            seaprice.setUpdateBy(SecurityUtils.getUsername());
+            tSeapriceMapper.updateTSeaprice(seaprice);
+            fId = seaprice.getfId();
+        } else {
+            seaprice.setCreateTime(new Date());
+            seaprice.setCreateBy(SecurityUtils.getUsername());
+            tSeapriceMapper.insertTSeaprice(seaprice);
+            fId = seaprice.getfId();
+        }
+        if (StringUtils.isEmpty(tSeapriceItem) || !"[]".equalsIgnoreCase(tSeapriceItem)) {
+            return AjaxResult.error("未找到海运费信息");
+        } else {
+            JSONArray parseArray = JSONArray.parseArray(tSeapriceItem);
+            List<TSeapriceitem> tSeapriceitems = JSONObject.parseArray(parseArray.toJSONString(), TSeapriceitem.class);
+            // 校验必填项
+            AjaxResult result = checkSeapriceItem(tSeapriceitems, "0");
+            if ("500".equals(result.get("code").toString())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+            // 校验是否存在重复费用id
+            List<Long> collect = tSeapriceitems.stream().map(TSeapriceitem::getfFeeid).collect(Collectors.toList());
+            long count = collect.stream().distinct().count();
+            if (collect.size() != count) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return AjaxResult.error("海运费中存在重复费用,请确认");
+            }
+            insertOrUpdateItem(tSeapriceitems, fId, "0");
+            String itemCode = ajaxResult.get("code").toString();
+            if ("500".equals(itemCode)) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+        }
+        if (StringUtils.isEmpty(tSeapriceFlees) || !"[]".equalsIgnoreCase(tSeapriceFlees)) {
+            return AjaxResult.error("未找到杂费信息");
+        } else {
+            JSONArray parseArray = JSONArray.parseArray(tSeapriceFlees);
+            List<TSeapriceitem> tSeapriceitems = JSONObject.parseArray(parseArray.toJSONString(), TSeapriceitem.class);
+            // 校验必填项
+            AjaxResult result = checkSeapriceItem(tSeapriceitems, "1");
+            if ("500".equals(result.get("code").toString())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+            // 校验是否存在重复费用id
+            List<Long> collect = tSeapriceitems.stream().map(TSeapriceitem::getfFeeid).collect(Collectors.toList());
+            long count = collect.stream().distinct().count();
+            if (collect.size() != count) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return AjaxResult.error("杂费表中存在重复费用,请确认");
+            }
+            insertOrUpdateItem(tSeapriceitems, fId, "1");
+            String itemCode = ajaxResult.get("code").toString();
+            if ("500".equals(itemCode)) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ajaxResult;
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 计算海运费
+     */
+    @Override
+    public AjaxResult calculateOceanFreight(TSeaprice tSeaprice) {
+        Map<String, Object> map = new HashMap<>();
+        // 求出海运费金额
+        tSeaprice.setfType("0");
+        tSeaprice.setfValiddate(new Date());
+        BigDecimal oceanAmt = tSeapriceMapper.selectSeapriceItemAmt(tSeaprice);
+        // 求出其他运费金额
+        tSeaprice.setfType("1");
+        BigDecimal otherAmt = tSeapriceMapper.selectSeapriceItemAmt(tSeaprice);
+        // 海运费金额合计 * 数量
+        oceanAmt = oceanAmt.multiply(new BigDecimal(tSeaprice.getfQty()));
+        // 海运费 * 数量 + 其他运费合计
+        otherAmt = otherAmt.add(tSeaprice.getExrate().multiply(new BigDecimal(tSeaprice.getfQty())));
+        // (海运费合计 + 其他运费合计) / 2
+        map.put("amt", oceanAmt.add(otherAmt).divide(new BigDecimal(tSeaprice.getfQty()),2,BigDecimal.ROUND_HALF_UP));
+        /*BigDecimal amt = oceanAmt.multiply(new BigDecimal(tSeaprice.getfQty())).add(tSeaprice.getExrate().multiply(new BigDecimal(tSeaprice.getfQty()))).add(otherAmt);
+        map.put("amt", amt.divide(new BigDecimal(tSeaprice.getfQty()),2,BigDecimal.ROUND_HALF_UP));*/
+        map.put("fleet", tSeapriceMapper.selectSeapriceItem(tSeaprice));
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 动态查询海运费、汇率
+     * @param tSeaprice 条件
+     * @return  结果
+     */
+    @Override
+    public AjaxResult changeSelectShippingFee(TSeaprice tSeaprice) {
+        tSeaprice.setfValiddate(new Date());
+        return AjaxResult.success(tSeapriceMapper.selectShippingFee(tSeaprice));
+    }
+
+    /**
+     *  校验主表必填项是否填写
+     * @param seaprice
+     * @return
+     */
+    public AjaxResult checkSeaprice (TSeaprice seaprice) {
+        if (StringUtils.isNull(seaprice.getfBilltype())) {
+            return AjaxResult.error("请维护业务类型");
+        }
+        if (StringUtils.isNull(seaprice.getfCorpid())) {
+            return AjaxResult.error("请维护船公司");
+        }
+        if (StringUtils.isNull(seaprice.getPolId())) {
+            return AjaxResult.error("请维护起运港");
+        }
+        if (StringUtils.isNull(seaprice.getPodId())) {
+            return AjaxResult.error("请维护目的港");
+        }
+        if (StringUtils.isNull(seaprice.getfValiddate())) {
+            return AjaxResult.error("请维护有效期");
+        }
+        if (DateUtils.belongCalendarBefore(seaprice.getfValiddate())) {
+            return AjaxResult.error("有效期时间不得早于当天");
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     *  校验明细表必填项是否填写
+     * @param tSeapriceitems
+     * @return
+     */
+    public AjaxResult checkSeapriceItem (List<TSeapriceitem> tSeapriceitems, String fType) {
+        int line = 1;
+        for (TSeapriceitem item : tSeapriceitems) {
+            if (StringUtils.isNull(item.getfFeeid())) {
+                if ("0".equalsIgnoreCase(fType)) {
+                    return AjaxResult.error("请维护海运费表第"+line+ "行未选择费用");
+                }
+                return AjaxResult.error("请维护杂费表第"+line+ "行未选择费用");
+            }
+        }
+        line++;
+        return AjaxResult.success();
+    }
+
+    /**
+     *  新增或更新明细信息
+     * @param tSeapriceitems    明细信息
+     * @param fId               主表id
+     * @param fType             类型
+     * @return  结果
+     */
+    @Transactional
+    public AjaxResult insertOrUpdateItem (List<TSeapriceitem> tSeapriceitems, Long fId, String fType) {
+        for (TSeapriceitem item : tSeapriceitems) {
+            item.setfPid(fId);
+            item.setfType(fType);
+            if (StringUtils.isNull(item.getfId())) {
+                item.setCreateTime(new Date());
+                item.setUpdateBy(SecurityUtils.getUsername());
+                tSeapriceitemMapper.insertTSeapriceitem(item);
+            } else {
+                item.setUpdateTime(new Date());
+                item.setUpdateBy(SecurityUtils.getUsername());
+                tSeapriceitemMapper.updateTSeapriceitem(item);
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 修改海运价主
+     * 
+     * @param tSeaprice 海运价主
+     * @return 结果
+     */
+    @Override
+    public int updateTSeaprice(TSeaprice tSeaprice)
+    {
+        tSeaprice.setUpdateTime(DateUtils.getNowDate());
+        return tSeapriceMapper.updateTSeaprice(tSeaprice);
+    }
+
+    /**
+     * 批量删除海运价主
+     * 
+     * @param fIds 需要删除的海运价主ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTSeapriceByIds(Long[] fIds)
+    {
+        return tSeapriceMapper.deleteTSeapriceByIds(fIds);
+    }
+
+    /**
+     * 删除海运价主信息
+     * 
+     * @param fId 海运价主ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTSeapriceById(Long fId)
+    {
+        return tSeapriceMapper.deleteTSeapriceById(fId);
+    }
+}

+ 2 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/mapper/TWarehousebillsitemsMapper.java

@@ -128,4 +128,6 @@ public interface TWarehousebillsitemsMapper extends BaseMapper<TWarehousebillsit
      * @return  结果
      */
     public int selectItemFStatusByFPid(Long fId);
+
+    public TWarehousebillsitems selectItemQtyByFPid(Long fPid);
 }

+ 7 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/ITWarehouseBillsService.java

@@ -434,4 +434,11 @@ public interface ITWarehouseBillsService {
      * @return  结果
      */
     public boolean checkCode(SysCheckCode sysCheckCode);
+
+    /**
+     *  导入【入库明细箱信息】Excel
+     * @param file  文件
+     * @return
+     */
+    public AjaxResult importLibraryInformation(MultipartFile file);
 }

+ 2 - 0
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/impl/TWarehouseAgreementServiceImpl.java

@@ -291,6 +291,8 @@ public class TWarehouseAgreementServiceImpl implements ITWarehouseAgreementServi
             auditItems.setLevelId(0L);
             auditItems.setBillId(fPid);
             auditItems.setActId(actId);
+            auditItems.setFidStatus("f_billstatus");
+            auditItems.setTimes(1L);
             auditItems.setIffinalItem("F");
             auditItems.setBillNo(tWarehouseAgreement.getfBillno());
             auditItems.setRefno1(String.valueOf(tWarehouseAgreement.getfCorpid()));

+ 221 - 33
ruoyi-warehouse/src/main/java/com/ruoyi/warehouseBusiness/service/impl/TWarehouseBillsServiceImpl.java

@@ -23,9 +23,10 @@ import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.quotation.domain.TSeaprice;
+import com.ruoyi.quotation.mapper.TSeapriceMapper;
 import com.ruoyi.reportManagement.domain.TWareHouseItemsExcel;
 import com.ruoyi.reportManagement.domain.TWhgenleg;
-import com.ruoyi.reportManagement.dto.TWarehousebill;
 import com.ruoyi.reportManagement.mapper.TWhgenlegMapper;
 import com.ruoyi.shipping.domain.TCntr;
 import com.ruoyi.shipping.domain.TVoyage;
@@ -109,6 +110,9 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
     private TWarehouseMapper tWarehouseMapper;
 
     @Autowired
+    private TSeapriceMapper tSeapriceMapper;
+
+    @Autowired
     private AuditItemsMapper auditItemsMapper;
 
     @Autowired
@@ -513,6 +517,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         TWarehouseBills warehouseBills = JSONArray.parseObject(tWarehouseBills, TWarehouseBills.class);
         Long timestamp = DateUtils.getTimestamp(new Date());
         warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         if (StringUtils.isNull(warehouseBills.getfId())) {
             // 如果是新数据
             warehouseBills.setfBillstatus(2L);
@@ -549,7 +557,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
             deleteBillsitems(fPid, tWarehousebillsitems);
         }
         // 库存明细添加
-        if (StringUtils.isNotNull(tWarehousebillsitems) && !"[]".equals(tWarehousebillsitems)) {
+        if (StringUtils.isNull(tWarehousebillsitems) || "[]".equals(tWarehousebillsitems)) {
+            warehouseBills.setfItemsStatus(1L);
+            tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
+        } else {
             JSONArray warehouseJSON = JSONArray.parseArray(tWarehousebillsitems);
             List<TWarehousebillsitems> warehousebillsitemsList = JSONObject.parseArray(warehouseJSON.toJSONString(), TWarehousebillsitems.class);
             for (TWarehousebillsitems wbItem : warehousebillsitemsList) {
@@ -584,9 +595,6 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                     }
                 }
             }
-        } else {
-            warehouseBills.setfItemsStatus(1L);
-            tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         }
         //  附件添加
         if (StringUtils.isNotNull(tEnclosure) && !"[]".equals(tEnclosure)) {
@@ -1037,9 +1045,22 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
             isApprove = true;
         }
         TWarehouseBills warehouseBills = JSONArray.parseObject(tWarehouseBills, TWarehouseBills.class);
+        SysConfig warehouseConfig = queryWarehouseConfig(billsType);
+        if (StringUtils.isNull(warehouseConfig)) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return AjaxResult.error("系统参数异常,未找到接单审批流参数");
+        }
+        if ("0".equals(sysConfig.getConfigValue()) && (warehouseBills.getWarehouseStatus() == 4L || warehouseBills.getWarehouseStatus() == 5L)) {
+            return AjaxResult.error("接单审批正在进行中,无法进行提交");
+        }
         warehouseBills.setfItemsStatus(4L);
         Long timestamp = DateUtils.getTimestamp(new Date());
         warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
+        warehouseBills.setfTimes(warehouseBills.getfTimes() + 1);
         if (StringUtils.isNull(warehouseBills.getfId())) {
             if (isApprove) {
                 warehouseBills.setfBillstatus(4L);
@@ -1058,7 +1079,6 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
             Date time = new Date();
             String bscorpno = billnoSerialServiceImpl.getCorpNo(warehouseBills.getfCorpid(), time);
             warehouseBills.setfBscorpno(bscorpno);
-            warehouseBills.setfTimes(1L);
             tWarehouseBillsMapper.insertTWarehousebills(warehouseBills);
             fPid = warehouseBills.getfId();
         } else {
@@ -1069,7 +1089,6 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 warehouseBills.setfBillstatus(6L);
                 warehouseBills.setfReviewDate(new Date());
             }
-            warehouseBills.setfTimes(warehouseBills.getfTimes() + 1);
             warehouseBills.setUpdateTime(new Date());
             if (!"SJRK".equals(billsType)) {
                 warehouseBills.setfChargedate(warehouseBills.getfBsdate());
@@ -1341,7 +1360,13 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         // 主表变更状态
         TWarehouseBills tWarehousebills = new TWarehouseBills();
         tWarehousebills.setfId(tWarehousebillsitems1.getfPid());
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        tWarehousebills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
         tWarehousebills.setfItemsStatus(3L);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehousebills.getfId());
+        tWarehousebills.setfQty(itemInFo.getfQty());
+        tWarehousebills.setfNetweight(itemInFo.getfNetweight());
+        tWarehousebills.setfGrossweight(itemInFo.getfGrossweight());
         int num1 = tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
         if (num <= 0 && num1 <= 0) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -1381,8 +1406,14 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 warehouseBills.setfMblno(warehouseBills.getfMblno() + "/" + tWarehousebillsitems.getfMblno());
             }
         }
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
         warehouseBills.setUpdateTime(new Date());
         warehouseBills.setUpdateBy(SecurityUtils.getUsername());
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         if (StringUtils.isNull(tWarehousebillsitems.getfId())) {
             tWarehousebillsitems.setCreateTime(new Date());
@@ -1761,6 +1792,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         }
         Long timestamp = DateUtils.getTimestamp(new Date());
         warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         // 仓库主表
         if (StringUtils.isNull(warehouseBills.getfId())) {
             return AjaxResult.error("请确认仓库信息是否保存");
@@ -1907,7 +1942,7 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
             auditItems.setAuditMsg("提交");
             auditItems.setAuditStatus("O");
             auditItems.setFidStatus("warehouse_status");
-            auditItems.setTimes(warehouseBills.getfTimes() + 1);
+            auditItems.setTimes(warehouseBills.getfTimes());
             AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
             String code = approvalFlow.get("code").toString();
             if ("500".equals(code)) {
@@ -1949,9 +1984,15 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 warehouseBills.setfMblno(warehouseBills.getfMblno() + "/" + warehousebillsitems.getfMblno());
             }
         }
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
         warehouseBills.setfItemsStatus(1L);
         warehouseBills.setUpdateTime(new Date());
         warehouseBills.setUpdateBy(SecurityUtils.getUsername());
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         warehousebillsitems.setfBillstatus(10L);
         warehousebillsitems.setCreateTime(new Date());
@@ -2483,6 +2524,16 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         if (StringUtils.isNull(warehouseBills.getfCorpid())) {
             return AjaxResult.error("库存明细请检查客户信息,操作终止");
         }
+        warehouseBills.setfItemsStatus(4L);
+        warehouseBills.setUpdateTime(new Date());
+        warehouseBills.setUpdateBy(SecurityUtils.getUsername());
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
+        tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         // 查询最新明细表
         TWarehousebillsitems warehousebillsitems = tWarehousebillsitemsMapper.selectTWarehousebillsitemsById(tWarehousebillsitems.getfId());
         if (StringUtils.isNull(warehousebillsitems) || warehousebillsitems.getfBillstatus() != 30L) {
@@ -2552,10 +2603,6 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
             // 添加状态log
             insertTWarehousebillsLog(tWarehousebillsitems, 40L, loginUser);
         }
-        warehouseBills.setfItemsStatus(4L);
-        warehouseBills.setUpdateTime(new Date());
-        warehouseBills.setUpdateBy(SecurityUtils.getUsername());
-        tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         tEnclosureMapper.deleteByFPid(warehouseBills.getfId());
         //  附件添加
         if (StringUtils.isNotEmpty(attachs) && !"[]".equals(attachs)) {
@@ -2642,7 +2689,13 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         }
         warehouseBills.setfItemsStatus(3L);
         warehouseBills.setUpdateTime(new Date());
+        Long timestamp = DateUtils.getTimestamp(new Date());
+        warehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
         warehouseBills.setUpdateBy(SecurityUtils.getUsername());
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(warehouseBills.getfId());
+        warehouseBills.setfQty(itemInFo.getfQty());
+        warehouseBills.setfNetweight(itemInFo.getfNetweight());
+        warehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
         tEnclosureMapper.deleteByFPid(warehouseBills.getfId());
         //  附件添加
@@ -2796,6 +2849,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehouseBills.setUpdateTime(new Date());
         Long timestamp = DateUtils.getTimestamp(new Date());
         tWarehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehouseBills.getfId());
+        tWarehouseBills.setfQty(itemInFo.getfQty());
+        tWarehouseBills.setfNetweight(itemInFo.getfNetweight());
+        tWarehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(tWarehouseBills);
         tEnclosureMapper.deleteByFPid(tWarehouseBills.getfId());
         tWarehousebillsfeesMapper.deleteByFPid(tWarehouseBills.getfId());
@@ -2945,20 +3002,13 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehouseBills.setfItemsStatus(4L);
         Long timestamp = DateUtils.getTimestamp(new Date());
         tWarehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
-        if (StringUtils.isNotNull(tWarehouseBills.getfId())) {
-            tWarehouseBills.setUpdateBy(loginUser.getUser().getUserName());
-            tWarehouseBills.setUpdateTime(new Date());
-            tWarehouseBillsMapper.updateTWarehousebills(tWarehouseBills);
-            fPid = tWarehouseBills.getfId();
-        } else {
-            tWarehouseBills.setfBsdeptid(loginUser.getUser().getDeptId());
-            tWarehouseBills.setCreateBy(loginUser.getUser().getUserName());
-            tWarehouseBills.setCreateTime(new Date());
-            String billNo = billnoSerialServiceImpl.getBillNo(billsType, tWarehouseBills.getfBsdate());
-            tWarehouseBills.setfBillno(billNo);
-            tWarehouseBillsMapper.insertTWarehousebills(tWarehouseBills);
-            fPid = tWarehouseBills.getfId();
-        }
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehouseBills.getfId());
+        tWarehouseBills.setfQty(itemInFo.getfQty());
+        tWarehouseBills.setfNetweight(itemInFo.getfNetweight());
+        tWarehouseBills.setfGrossweight(itemInFo.getfGrossweight());
+        tWarehouseBills.setUpdateBy(loginUser.getUser().getUserName());
+        tWarehouseBills.setUpdateTime(new Date());
+        fPid = tWarehouseBills.getfId();
         tEnclosureMapper.deleteByFPid(fPid);
         tWarehousebillsfeesMapper.deleteByFPid(fPid);
         tWarehousebillsCntrMapper.deleteTWarehousebillsCntrfPid(fPid);
@@ -3169,6 +3219,7 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 tWarehousebillsfeesMapper.insertTWarehousebillsfees(wbCr);
             }
         }
+        tWarehouseBillsMapper.updateTWarehousebills(tWarehouseBills);
         map.put("fPid", fPid);
         map.put("warehouse", tWarehouseBills);
         map.put("warehouseItem", warehousebillsitemsList);
@@ -3215,6 +3266,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehouseBills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
         tWarehouseBills.setUpdateBy(loginUser.getUser().getUserName());
         tWarehouseBills.setUpdateTime(new Date());
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehouseBills.getfId());
+        tWarehouseBills.setfQty(itemInFo.getfQty());
+        tWarehouseBills.setfNetweight(itemInFo.getfNetweight());
+        tWarehouseBills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(tWarehouseBills);
         tEnclosureMapper.deleteByFPid(tWarehouseBills.getfId());
         tWarehousebillsfeesMapper.deleteByFPid(tWarehouseBills.getfId());
@@ -3547,6 +3602,7 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         /*if (billstatus && (StringUtils.isNull(warehouseFees) || "[]".equals(warehouseFees))) {
             return AjaxResult.error("未找到应收款明细无法提交");
         }*/
+        tWarehousebills.setfTimes(tWarehousebills.getfTimes() + 1);
         if (StringUtils.isNotNull(tWarehousebills.getfId())) {
             fPid = tWarehousebills.getfId();
             tWarehousebills.setUpdateTime(new Date());
@@ -3617,6 +3673,8 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 auditItems.setAuditOpTime(new Date());
                 auditItems.setAuditMsg("提交");
                 auditItems.setAuditStatus("O");
+                auditItems.setFidStatus("f_billstatus");
+                auditItems.setTimes(tWarehousebills.getfTimes());
                 AjaxResult approvalFlow = auditItemsService.createApprovalFlow(auditItems);
                 String code = approvalFlow.get("code").toString();
 //                Long code = Long.valueOf(String.valueOf(ajaxResult.get("code"))).longValue();
@@ -3857,7 +3915,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehousebills.setfReviewDate(null);// 审核通过时间清空
         Long timestamp = DateUtils.getTimestamp(new Date());
         tWarehousebills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
-        tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehousebills.getfId());
+        tWarehousebills.setfQty(itemInFo.getfQty());
+        tWarehousebills.setfNetweight(itemInFo.getfNetweight());
+        tWarehousebills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehousebillsfeesMapper.warehouseFeesFollowUpdate(tWarehousebills.getfId(), 2L, new Date());
         if ("JSCCF".equals(tWarehousebills.getfBilltype())) {
             List<TWarehousebillsfees> feesList = tWarehousebillsfeesMapper.selectWarehousebillsfeesByPId(fId);
@@ -3888,6 +3949,7 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 }
             }
         }
+        tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
         return AjaxResult.success(tWarehousebills.getfDateChanged());
     }
 
@@ -3909,6 +3971,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehousebills.setUpdateBy(SecurityUtils.getUsername());
         Long timestamp = DateUtils.getTimestamp(new Date());
         tWarehousebills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehousebills.getfId());
+        tWarehousebills.setfQty(itemInFo.getfQty());
+        tWarehousebills.setfNetweight(itemInFo.getfNetweight());
+        tWarehousebills.setfGrossweight(itemInFo.getfGrossweight());
         tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
         return AjaxResult.success(tWarehousebills.getfDateChanged());
     }
@@ -3920,10 +3986,14 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
      */
     @Override
     public boolean checkCode(SysCheckCode sysCheckCode) {
-            switch (sysCheckCode.getfType()) {
-            case "warehouse" :
+        String dateChanged = "";
+        switch (sysCheckCode.getfType()) {
+            case "warehouse":
                 // 查询仓储业务
                 TWarehouseBills warehouseBills = tWarehouseBillsMapper.selectTWarehousebillsById(sysCheckCode.getfId());
+                if (StringUtils.isNull(warehouseBills)) {
+                    return false;
+                }
                 if (StringUtils.isNotNull(sysCheckCode.getfId()) && StringUtils.isEmpty(warehouseBills.getfDateChanged())) {
                     Long timestamp = DateUtils.getTimestamp(new Date());
                     warehouseBills.setUpdateTime(new Date());
@@ -3932,19 +4002,133 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                     tWarehouseBillsMapper.updateTWarehousebills(warehouseBills);
                     return true;
                 }
-                if (StringUtils.isEmpty(sysCheckCode.getCodeVal()) && StringUtils.isNotEmpty(warehouseBills.getfDateChanged())) {
+                dateChanged = warehouseBills.getfDateChanged();
+                break;
+            case "freight":
+                // 查询运价维护业务
+                TSeaprice seaprice = tSeapriceMapper.selectTSeapriceById(sysCheckCode.getfId());
+                if (StringUtils.isNull(seaprice)) {
                     return false;
                 }
-                // 是否符合数据库编码
-                if (sysCheckCode.getCodeVal().equals(warehouseBills.getfDateChanged())) {
+                if (StringUtils.isNotNull(sysCheckCode.getfId()) && StringUtils.isEmpty(seaprice.getfDateChanged())) {
+                    Long timestamp = DateUtils.getTimestamp(new Date());
+                    seaprice.setUpdateTime(new Date());
+                    seaprice.setUpdateBy(SecurityUtils.getUsername());
+                    seaprice.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
+                    tSeapriceMapper.updateTSeaprice(seaprice);
                     return true;
                 }
+                dateChanged = seaprice.getfDateChanged();
                 break;
         }
+        if (StringUtils.isEmpty(sysCheckCode.getCodeVal()) && StringUtils.isNotEmpty(dateChanged)) {
+            return false;
+        }
+        // 是否符合数据库编码
+        if (sysCheckCode.getCodeVal().equals(dateChanged)) {
+            return true;
+        }
         return false;
     }
 
     /**
+     *  导入【入库明细箱信息】Excel
+     * @param file  文件
+     * @return
+     */
+    @Override
+    public AjaxResult importLibraryInformation(MultipartFile file) {
+        List<TWarehousebillsitems> itemList = new ArrayList<>();
+
+        InputStream inputStream = null;
+        try {
+            inputStream = file.getInputStream();
+            String originalFilename = file.getOriginalFilename();
+            Workbook workbook = null;
+            if (originalFilename.endsWith("xls")) {
+                workbook = WorkbookFactory.create(inputStream);
+            } else if (originalFilename.endsWith("xlsx")) {
+                workbook = new XSSFWorkbook(inputStream);
+            }
+            Sheet sheet = workbook.getSheetAt(0);
+            int line = 0;
+            for (Row rows : sheet) {
+                line++;
+                if (rows.getRowNum() == 0) {
+                    continue;
+                }
+                TWarehousebillsitems warehousebillsitems = new TWarehousebillsitems();
+                for (int a = 0; a < rows.getPhysicalNumberOfCells(); a++) {
+                    Cell cell = rows.getCell(a);
+                    String value = filter(sheet.getRow(0), CellReference.convertNumToColString(cell.getColumnIndex()));
+                    switch (value) {
+                        case "箱号":
+                            //设置单元格类型
+                            cell.setCellType(CellType.STRING);
+                            if (StringUtils.isEmpty(cell.getStringCellValue())) {
+                                return AjaxResult.error("Excel箱信息数据第" + line + "行数据缺少箱号");
+                            }
+                            warehousebillsitems.setfCntrno(cell.getStringCellValue());
+                            break;
+                        /*case "铅封号":
+                            //设置单元格类型
+                            cell.setCellType(CellType.STRING);
+                            if (StringUtils.isEmpty(cell.getStringCellValue())) {
+                                return AjaxResult.error("Excel箱信息数据第" + line + "箱类型");
+                            }
+                            companyMsg.setTypeidName(cell.getStringCellValue());
+                            if (StringUtils.isNotEmpty(cell.getStringCellValue())) {
+                                Long fId = tCntrMapper.selectRcntrFId(companyMsg.getTypeidName());
+                                companyMsg.setfTypeid(fId);
+                            }
+                            break;
+                        case "预计件数":
+                            //设置单元格类型
+                            cell.setCellType(CellType.STRING);
+                            if (StringUtils.isEmpty(cell.getStringCellValue())) {
+                                return AjaxResult.error("Excel箱信息数据第" + line + "行数据缺少最新地点");
+                            }
+                            companyMsg.setAddressName((cell.getStringCellValue()));
+                            break;
+                        case "预计毛重":
+                            //设置单元格类型
+                            cell.setCellType(CellType.STRING);
+                            if (StringUtils.isEmpty(cell.getStringCellValue())) {
+                                return AjaxResult.error("Excel箱信息数据第" + line + "行数据缺少货名");
+                            }
+                            companyMsg.setOwnerName(cell.getStringCellValue());
+                            if (StringUtils.isNotEmpty(cell.getStringCellValue())) {
+                                String fPackageid = sysDictDataMapper.selectDictValue("f_owner", cell.getStringCellValue());
+                                if (StringUtils.isNotEmpty(fPackageid)) {
+                                    companyMsg.setfOwner(fPackageid);
+                                }
+                            }
+                            break;
+                        case "预计净重":
+                            //设置单元格类型
+                            cell.setCellType(CellType.STRING);
+                            if (StringUtils.isEmpty(cell.getStringCellValue())) {
+                                return AjaxResult.error("Excel箱信息数据第" + line + "行数据缺少箱状态");
+                            }
+                            companyMsg.setCntrstatusName(cell.getStringCellValue());
+                            if (StringUtils.isNotEmpty(cell.getStringCellValue())) {
+                                String setCntrstatusid = sysDictDataMapper.selectDictValue("f_cntrstatus", cell.getStringCellValue());
+                                if (StringUtils.isNotEmpty(setCntrstatusid)) {
+                                    companyMsg.setfCntrstatus(setCntrstatusid);
+                                }
+                            }
+                            break;*/
+                    }
+                }
+                itemList.add(warehousebillsitems);
+            }
+        } catch (IOException e) {
+            return AjaxResult.error("上传文件失败,请检查文件是否损坏");
+        }
+        return AjaxResult.success("success", itemList);
+    }
+
+    /**
      * 撤销入账
      *
      * @param warehouseBills      主表
@@ -3969,7 +4153,10 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
         tWarehousebills.setUpdateBy(loginUser.getUsername());
         Long timestamp = DateUtils.getTimestamp(new Date());
         tWarehousebills.setfDateChanged(timestamp.toString() + (int) (Math.random() * 900) + 100);
-        tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
+        TWarehousebillsitems itemInFo = tWarehousebillsitemsMapper.selectItemQtyByFPid(tWarehousebills.getfId());
+        tWarehousebills.setfQty(itemInFo.getfQty());
+        tWarehousebills.setfNetweight(itemInFo.getfNetweight());
+        tWarehousebills.setfGrossweight(itemInFo.getfGrossweight());
         tEnclosureMapper.deleteByFPid(tWarehousebills.getfId());
         tWarehousebillsfeesMapper.deleteByFPid(tWarehousebills.getfId());
         tWarehousebillsCntrMapper.deleteTWarehousebillsCntrfPid(tWarehousebills.getfId());
@@ -4159,6 +4346,7 @@ public class TWarehouseBillsServiceImpl implements ITWarehouseBillsService {
                 tWarehousebillsfeesMapper.insertTWarehousebillsfees(wbCr);
             }
         }
+        tWarehouseBillsMapper.updateTWarehousebills(tWarehousebills);
         return AjaxResult.success(tWarehousebills.getfDateChanged());
     }
 

+ 4 - 4
ruoyi-warehouse/src/main/resources/mapper/finance/TFeeMapper.xml

@@ -92,7 +92,7 @@
         ware.f_amtcr,
         ware.f_billtype,
         CASE
-        WHEN ware.f_billstatus = '1' THEN '保存'
+        WHEN ware.f_billstatus = '1' THEN '新建'
         WHEN ware.f_billstatus = '2' THEN '暂存'
         WHEN ware.f_billstatus = '3' THEN '审批驳回'
         WHEN ware.f_billstatus = '4' THEN '提交审核'
@@ -178,7 +178,7 @@
         f.f_billtype AS fBilltype,
         f.f_system_type AS fSystemType,
         CASE
-        WHEN f.f_billstatus = '1' THEN '保存'
+        WHEN f.f_billstatus = '1' THEN '新建'
         WHEN f.f_billstatus = '2' THEN '暂存'
         WHEN f.f_billstatus = '3' THEN '审批驳回'
         WHEN f.f_billstatus = '4' THEN '提交审核'
@@ -309,7 +309,7 @@
         f.bank AS bank,
         f.water_bill_no AS waterBillNo,
         CASE
-        WHEN f.f_billstatus = '1' THEN '保存'
+        WHEN f.f_billstatus = '1' THEN '新建'
         WHEN f.f_billstatus = '2' THEN '暂存'
         WHEN f.f_billstatus = '3' THEN '审批驳回'
         WHEN f.f_billstatus = '4' THEN '提交审核'
@@ -1627,7 +1627,7 @@
         ware.f_amtcr AS fAmtcr,
         ware.f_remarks AS fRemarks,
         CASE
-        WHEN ware.f_billstatus = '1' THEN '保存'
+        WHEN ware.f_billstatus = '1' THEN '新建'
         WHEN ware.f_billstatus = '2' THEN '暂存'
         WHEN ware.f_billstatus = '3' THEN '审批驳回'
         WHEN ware.f_billstatus = '4' THEN '提交审核'

+ 210 - 0
ruoyi-warehouse/src/main/resources/mapper/quotation/TSeapriceMapper.xml

@@ -0,0 +1,210 @@
+<?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.ruoyi.quotation.mapper.TSeapriceMapper">
+    
+    <resultMap type="TSeaprice" id="TSeapriceResult">
+        <result property="fId"    column="f_id"    />
+        <result property="fBilltype"    column="f_billtype"    />
+        <result property="fCorpid"    column="f_corpid"    />
+        <result property="polId"    column="pol_id"    />
+        <result property="podId"    column="pod_id"    />
+        <result property="fValiddate"    column="f_validdate"    />
+        <result property="fDateChanged"    column="f_date_changed"    />
+        <result property="fBillstatus"    column="f_billstatus"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remarks"    column="remarks"    />
+    </resultMap>
+
+    <sql id="selectTSeapriceVo">
+        select f_id, f_billtype, f_corpid, pol_id, pod_id, f_validdate, f_date_changed, f_billstatus, del_flag, create_by, create_time, update_by, update_time, remarks from t_seaprice
+    </sql>
+
+    <select id="selectTSeapriceList" parameterType="TSeaprice" resultMap="TSeapriceResult">
+        <include refid="selectTSeapriceVo"/>
+        <where>  
+            <if test="fBilltype != null "> and f_billtype = #{fBilltype}</if>
+            <if test="fCorpid != null "> and f_corpid = #{fCorpid}</if>
+            <if test="polId != null "> and pol_id = #{polId}</if>
+            <if test="podId != null "> and pod_id = #{podId}</if>
+            <if test="fValiddate != null "> and f_validdate = #{fValiddate}</if>
+            <if test="fBillstatus != null "> and f_billstatus = #{fBillstatus}</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+        </where>
+    </select>
+    
+    <select id="selectTSeapriceById" parameterType="Long" resultMap="TSeapriceResult">
+        <include refid="selectTSeapriceVo"/>
+        where f_id = #{fId}
+    </select>
+
+    <select id="selectTSeapriceMapList" parameterType="TSeaprice" resultType="Map">
+        SELECT
+            s.f_id fId,
+            t.dict_label fBilltype,
+            c.f_cname fCorpid,
+        CASE
+            WHEN s.f_billstatus = '0' THEN
+            '正常'
+            WHEN s.f_billstatus = '1' THEN
+            '停用'
+            END AS fBillstatus,
+            pol.dict_label polId,
+            pod.dict_label podId,
+            s.create_by createBy,
+            s.f_validdate fValiddate,
+            s.remarks
+        FROM
+            t_seaprice s
+            LEFT JOIN sys_dict_data t ON t.dict_value = s.f_billtype AND t.dict_type = 'data_billType'
+            LEFT JOIN sys_dict_data pol ON pol.dict_value = s.pol_id AND pol.dict_type = 'port_start'
+            LEFT JOIN sys_dict_data pod ON pod.dict_value = s.pod_id AND pod.dict_type = 'port_end'
+            LEFT JOIN t_corps c ON c.f_id = s.f_corpid
+        <where>
+            <if test="fBilltype != null "> and s.f_billtype = #{fBilltype}</if>
+            <if test="fCorpid != null "> and s.f_corpid = #{fCorpid}</if>
+            <if test="polId != null "> and s.pol_id = #{polId}</if>
+            <if test="podId != null "> and s.pod_id = #{podId}</if>
+            <if test="fValiddate != null "> and s.f_validdate = #{fValiddate}</if>
+            <if test="fBillstatus != null "> and s.f_billstatus = #{fBillstatus}</if>
+            <if test="remarks != null  and remarks != ''"> and remarks = #{remarks}</if>
+        </where>
+        ORDER BY s.f_id DESC
+    </select>
+
+    <select id="checkSeapriceByValiddate" parameterType="TSeaprice" resultType="int">
+        SELECT
+            COUNT(f_id)
+        FROM
+            t_seaprice
+        WHERE
+            f_id != #{fId}
+            AND f_billtype = #{fBilltype}
+            AND f_corpid = #{fCorpid}
+            AND pol_id = #{polId}
+            AND pod_id = #{podId}
+            AND pod_id = #{podId}
+            AND f_validdate &gt;= #{fValiddate}
+    </select>
+
+    <select id="selectSeapriceItemAmt" parameterType="TSeaprice" resultType="BigDecimal">
+        SELECT
+            IFNULL( SUM( IF ( #{fType} = '0', s.${fSpecification}, s.f_unitprice ) ), 0 )
+        FROM
+            t_seaprice t
+            LEFT JOIN t_seapriceitem s ON s.f_pid = t.f_id
+        WHERE
+            t.f_billtype = #{fBilltype}
+            AND t.f_corpid = #{fCorpid}
+            AND t.f_validdate &gt;= #{fValiddate}
+            AND t.f_billstatus = 0
+            AND t.del_flag = '0'
+            AND s.f_type = #{fType}
+    </select>
+
+    <select id="selectSeapriceItem" parameterType="TSeaprice" resultType="com.ruoyi.quotation.domain.TSeapriceitem">
+       SELECT
+            s.f_id fId,
+            s.f_feeid fFeeid,
+        IF
+            ( ${fType} = '0', s.${fSpecification}, s.f_unitprice ) fUnitprice
+        FROM
+            t_seaprice t
+            LEFT JOIN t_seapriceitem s ON s.f_pid = t.f_id
+        WHERE
+            t.f_billtype = #{fBilltype}
+            AND t.f_corpid = #{fCorpid}
+            AND t.f_validdate &gt;= #{fValiddate}
+            AND t.f_billstatus = 0
+            AND t.del_flag = '0'
+    </select>
+
+    <select id="selectShippingFee" parameterType="TSeaprice" resultType="com.ruoyi.quotation.domain.TSeapriceitem">
+        SELECT
+            s.f_id fId,
+            s.f_feeid fFeeid,
+            IFNULL(s.${fSpecification}, 0) fUnitprice,
+            IFNULL(s.f_exrate, 0) fExrate
+        FROM
+            t_seaprice t
+            LEFT JOIN t_seapriceitem s ON s.f_pid = t.f_id
+        WHERE
+            t.f_billtype = #{fBilltype}
+            AND t.f_corpid = #{fCorpid}
+            AND t.f_validdate &gt;= #{fValiddate}
+            AND t.f_billstatus = 0
+            AND t.del_flag = '0'
+        ORDER BY t.f_id asc LIMIT 0, 1
+    </select>
+
+    <insert id="insertTSeaprice" parameterType="TSeaprice" useGeneratedKeys="true" keyProperty="fId">
+        insert into t_seaprice
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fBilltype != null">f_billtype,</if>
+            <if test="fCorpid != null">f_corpid,</if>
+            <if test="polId != null">pol_id,</if>
+            <if test="podId != null">pod_id,</if>
+            <if test="fValiddate != null">f_validdate,</if>
+            <if test="fDateChanged != null">f_date_changed,</if>
+            <if test="fBillstatus != null">f_billstatus,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remarks != null">remarks,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fBilltype != null">#{fBilltype},</if>
+            <if test="fCorpid != null">#{fCorpid},</if>
+            <if test="polId != null">#{polId},</if>
+            <if test="podId != null">#{podId},</if>
+            <if test="fValiddate != null">#{fValiddate},</if>
+            <if test="fDateChanged != null">#{fDateChanged},</if>
+            <if test="fBillstatus != null">#{fBillstatus},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remarks != null">#{remarks},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTSeaprice" parameterType="TSeaprice">
+        update t_seaprice
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fBilltype != null">f_billtype = #{fBilltype},</if>
+            <if test="fCorpid != null">f_corpid = #{fCorpid},</if>
+            <if test="polId != null">pol_id = #{polId},</if>
+            <if test="podId != null">pod_id = #{podId},</if>
+            <if test="fValiddate != null">f_validdate = #{fValiddate},</if>
+            <if test="fBillstatus != null">f_billstatus = #{fBillstatus},</if>
+            <if test="fDateChanged != null">f_date_changed = #{fDateChanged},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+        </trim>
+        where f_id = #{fId}
+    </update>
+
+    <delete id="deleteTSeapriceById" parameterType="Long">
+        delete from t_seaprice where f_id = #{fId}
+    </delete>
+
+    <delete id="deleteTSeapriceByIds" parameterType="String">
+        delete from t_seaprice where f_id in 
+        <foreach item="fId" collection="array" open="(" separator="," close=")">
+            #{fId}
+        </foreach>
+    </delete>
+    
+</mapper>

+ 136 - 0
ruoyi-warehouse/src/main/resources/mapper/quotation/TSeapriceitemMapper.xml

@@ -0,0 +1,136 @@
+<?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.ruoyi.quotation.mapper.TSeapriceitemMapper">
+    
+    <resultMap type="TSeapriceitem" id="TSeapriceitemResult">
+        <result property="fId"    column="f_id"    />
+        <result property="fPid"    column="f_pid"    />
+        <result property="fFeeid"    column="f_feeid"    />
+        <result property="fSpecification1"    column="f_specification1"    />
+        <result property="fSpecification2"    column="f_specification2"    />
+        <result property="fSpecification3"    column="f_specification3"    />
+        <result property="fSpecification4"    column="f_specification4"    />
+        <result property="fSpecification5"    column="f_specification5"    />
+        <result property="fSpecification6"    column="f_specification6"    />
+        <result property="fExrate"    column="f_exrate"    />
+        <result property="fUnitprice"    column="f_unitprice"    />
+        <result property="fType"    column="f_type"    />
+        <result property="fBillstatus"    column="f_billstatus"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectTSeapriceitemVo">
+        select f_id, f_pid, f_feeid, f_specification1, f_specification2, f_specification3, f_specification4, f_specification5, f_specification6, f_exrate, f_unitprice, f_type, f_billstatus, del_flag, create_by, create_time, update_by, update_time, remark from t_seapriceitem
+    </sql>
+
+    <select id="selectTSeapriceitemList" parameterType="TSeapriceitem" resultMap="TSeapriceitemResult">
+        <include refid="selectTSeapriceitemVo"/>
+        <where>  
+            <if test="fPid != null "> and f_pid = #{fPid}</if>
+            <if test="fFeeid != null "> and f_feeid = #{fFeeid}</if>
+            <if test="fSpecification1 != null "> and f_specification1 = #{fSpecification1}</if>
+            <if test="fSpecification2 != null "> and f_specification2 = #{fSpecification2}</if>
+            <if test="fSpecification3 != null "> and f_specification3 = #{fSpecification3}</if>
+            <if test="fSpecification4 != null "> and f_specification4 = #{fSpecification4}</if>
+            <if test="fSpecification5 != null "> and f_specification5 = #{fSpecification5}</if>
+            <if test="fSpecification6 != null "> and f_specification6 = #{fSpecification6}</if>
+            <if test="fExrate != null "> and f_exrate = #{fExrate}</if>
+            <if test="fUnitprice != null "> and f_unitprice = #{fUnitprice}</if>
+            <if test="fType != null  and fType != ''"> and f_type = #{fType}</if>
+            <if test="fBillstatus != null "> and f_billstatus = #{fBillstatus}</if>
+        </where>
+    </select>
+    
+    <select id="selectTSeapriceitemById" parameterType="Long" resultMap="TSeapriceitemResult">
+        <include refid="selectTSeapriceitemVo"/>
+        where f_id = #{fId}
+    </select>
+        
+    <insert id="insertTSeapriceitem" parameterType="TSeapriceitem" useGeneratedKeys="true" keyProperty="fId">
+        insert into t_seapriceitem
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fPid != null">f_pid,</if>
+            <if test="fFeeid != null">f_feeid,</if>
+            <if test="fSpecification1 != null">f_specification1,</if>
+            <if test="fSpecification2 != null">f_specification2,</if>
+            <if test="fSpecification3 != null">f_specification3,</if>
+            <if test="fSpecification4 != null">f_specification4,</if>
+            <if test="fSpecification5 != null">f_specification5,</if>
+            <if test="fSpecification6 != null">f_specification6,</if>
+            <if test="fExrate != null">f_exrate,</if>
+            <if test="fUnitprice != null">f_unitprice,</if>
+            <if test="fType != null and fType != ''">f_type,</if>
+            <if test="fBillstatus != null">f_billstatus,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fPid != null">#{fPid},</if>
+            <if test="fFeeid != null">#{fFeeid},</if>
+            <if test="fSpecification1 != null">#{fSpecification1},</if>
+            <if test="fSpecification2 != null">#{fSpecification2},</if>
+            <if test="fSpecification3 != null">#{fSpecification3},</if>
+            <if test="fSpecification4 != null">#{fSpecification4},</if>
+            <if test="fSpecification5 != null">#{fSpecification5},</if>
+            <if test="fSpecification6 != null">#{fSpecification6},</if>
+            <if test="fExrate != null">#{fExrate},</if>
+            <if test="fUnitprice != null">#{fUnitprice},</if>
+            <if test="fType != null and fType != ''">#{fType},</if>
+            <if test="fBillstatus != null">#{fBillstatus},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTSeapriceitem" parameterType="TSeapriceitem">
+        update t_seapriceitem
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fPid != null">f_pid = #{fPid},</if>
+            <if test="fFeeid != null">f_feeid = #{fFeeid},</if>
+            <if test="fSpecification1 != null">f_specification1 = #{fSpecification1},</if>
+            <if test="fSpecification2 != null">f_specification2 = #{fSpecification2},</if>
+            <if test="fSpecification3 != null">f_specification3 = #{fSpecification3},</if>
+            <if test="fSpecification4 != null">f_specification4 = #{fSpecification4},</if>
+            <if test="fSpecification5 != null">f_specification5 = #{fSpecification5},</if>
+            <if test="fSpecification6 != null">f_specification6 = #{fSpecification6},</if>
+            <if test="fExrate != null">f_exrate = #{fExrate},</if>
+            <if test="fUnitprice != null">f_unitprice = #{fUnitprice},</if>
+            <if test="fType != null and fType != ''">f_type = #{fType},</if>
+            <if test="fBillstatus != null">f_billstatus = #{fBillstatus},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where f_id = #{fId}
+    </update>
+
+    <delete id="deleteTSeapriceitemById" parameterType="Long">
+        delete from t_seapriceitem where f_id = #{fId}
+    </delete>
+
+    <delete id="deleteTSeapriceitemByIds" parameterType="String">
+        delete from t_seapriceitem where f_id in 
+        <foreach item="fId" collection="array" open="(" separator="," close=")">
+            #{fId}
+        </foreach>
+    </delete>
+    
+</mapper>

+ 14 - 0
ruoyi-warehouse/src/main/resources/mapper/warehouseBusiness/TWarehousebillsitemsMapper.xml

@@ -611,6 +611,8 @@
             t.f_cntqty cntqty,
             t.f_cntrno cntrno,
             t.f_qty fQty,
+            t.f_truckno fTruckno,
+            t.f_driver_name fDriverName,
             t.f_originalbilldate fOriginalbilldate,
             t.f_grossweight fGrossweight,
             t.f_netweight fNetweight,
@@ -650,6 +652,18 @@
             AND i.f_billstatus = 40
     </select>
 
+    <select id="selectItemQtyByFPid" resultType="com.ruoyi.warehouseBusiness.domain.TWarehousebillsitems">
+        SELECT
+            IFNULL( SUM( f_qty ), 0 ) fQty,
+            IFNULL( SUM( f_grossweight ), 0 ) fGrossweight,
+            IFNULL( SUM( f_netweight ), 0 ) fNetweight
+        FROM
+            t_warehousebillsitems
+        WHERE
+            f_pid = #{fPid}
+            AND f_billstatus = 40
+    </select>
+
     <update id="warehouseItemFollowUpdate" parameterType="Long">
         update
             t_warehousebillsitems