Browse Source

2023年2月8日21:41:14

纪新园 2 years ago
parent
commit
c836f15eb9
17 changed files with 732 additions and 85 deletions
  1. 2 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxItem.java
  2. 8 1
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingBill.java
  3. 1 19
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingBoxType.java
  4. 10 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingFees.java
  5. 2 20
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingMatchBox.java
  6. 8 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/feign/IFinanceClient.java
  7. 23 7
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/controller/ShippingBillController.java
  8. 26 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/controller/ShippingFeesController.java
  9. 1 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/mapper/ShippingBillMapper.java
  10. 56 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/mapper/ShippingBillMapper.xml
  11. 8 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/service/IShippingBillService.java
  12. 279 36
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/service/impl/ShippingBillServiceImpl.java
  13. 2 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java
  14. 215 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java
  15. 11 0
      blade-service/trade-finance/src/main/java/org/springblade/finance/controller/SettlementController.java
  16. 2 0
      blade-service/trade-finance/src/main/java/org/springblade/finance/service/ISettlementService.java
  17. 78 1
      blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

+ 2 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxItem.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.box.tube.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -223,6 +224,7 @@ public class TradingBoxItem implements Serializable {
 	 * 退租日期
 	 */
 	@ApiModelProperty(value = "退租日期")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date rentingOutDate;
 
 

+ 8 - 1
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingBill.java

@@ -452,6 +452,7 @@ public class ShippingBill implements Serializable {
 	 * TEU
 	 */
 	@ApiModelProperty(value = "TEU")
+	@TableField("shipping_box_type_TEU")
 	private String shippingBoxTypeTEU;
 
 	/**
@@ -470,12 +471,14 @@ public class ShippingBill implements Serializable {
 	 * 应收外币
 	 */
 	@ApiModelProperty(value = "应收外币")
+	@TableField("receivable_USD")
 	private String receivableUSD;
 
 	/**
 	 * 应收人民币
 	 */
 	@ApiModelProperty(value = "应收人民币")
+	@TableField("receivable_RMB")
 	private String receivableRMB;
 
 
@@ -483,24 +486,28 @@ public class ShippingBill implements Serializable {
 	 * 应付外币
 	 */
 	@ApiModelProperty(value = "应付外币")
+	@TableField("pay_USD")
 	private String payUSD;
 
 	/**
 	 * 应付人民币
 	 */
 	@ApiModelProperty(value = "应付人民币")
+	@TableField("pay_RMB")
 	private String payRMB;
 
 	/**
 	 * 利润外币
 	 */
 	@ApiModelProperty(value = "利润外币")
+	@TableField("profit_USD")
 	private String profitUSD;
 
 	/**
 	 * 利润人民币
 	 */
 	@ApiModelProperty(value = "利润人民币")
+	@TableField("profit_RMB")
 	private String profitRMB;
 
 	/**
@@ -515,7 +522,7 @@ public class ShippingBill implements Serializable {
 	@TableField(exist = false)
 	private String approvalType;
 
-	//请核标识  1买箱 2卖箱
+	//请核标识  1 2卖箱
 	@TableField(exist = false)
 	private Integer checkFlag;
 	//跳转对应页面的路由

+ 1 - 19
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingBoxType.java

@@ -46,17 +46,7 @@ public class ShippingBoxType implements Serializable {
 	 * 箱型
 	 */
 	@ApiModelProperty(value = "箱型")
-	private Long boxTypeId;
-	/**
-	 * 箱型
-	 */
-	@TableField(exist = false)
-	private String $boxTypeId;
-	/**
-	 * 箱型
-	 */
-	@ApiModelProperty(value = "箱型")
-	private String boxTypeName;
+	private String boxType;
 	/**
 	 * 箱量
 	 */
@@ -134,12 +124,4 @@ public class ShippingBoxType implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
-
-	public String get$boxTypeId() {
-		return $boxTypeId;
-	}
-
-	public void set$boxTypeId(String $boxTypeId) {
-		this.$boxTypeId = $boxTypeId;
-	}
 }

+ 10 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingFees.java

@@ -167,6 +167,16 @@ public class ShippingFees implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
+	/**
+	 * 结算金额
+	 */
+	@ApiModelProperty(value = "结算金额")
+	private BigDecimal settlementAmount;
+	/**
+	 * 结算时间
+	 */
+	@ApiModelProperty(value = "结算时间")
+	private Date settlementDate;
 
 
 }

+ 2 - 20
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/ocean/entity/ShippingMatchBox.java

@@ -46,17 +46,7 @@ public class ShippingMatchBox implements Serializable {
 	 * 箱型
 	 */
 	@ApiModelProperty(value = "箱型")
-	private Long boxTypeId;
-	/**
-	 * 箱型
-	 */
-	@TableField(exist = false)
-	private String $boxTypeId;
-	/**
-	 * 箱型
-	 */
-	@ApiModelProperty(value = "箱型")
-	private String boxTypeName;
+	private String boxType;
 	/**
 	 * 箱号
 	 */
@@ -67,7 +57,7 @@ public class ShippingMatchBox implements Serializable {
 	 */
 	@ApiModelProperty(value = "hs代码")
 	@TableField("HSCODE")
-	private String hscode;
+	private String hsCode;
 	/**
 	 * 货物明细
 	 */
@@ -140,12 +130,4 @@ public class ShippingMatchBox implements Serializable {
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
 
-
-	public String get$boxTypeId() {
-		return $boxTypeId;
-	}
-
-	public void set$boxTypeId(String $boxTypeId) {
-		this.$boxTypeId = $boxTypeId;
-	}
 }

+ 8 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/feign/IFinanceClient.java

@@ -83,6 +83,14 @@ public interface IFinanceClient {
 	R paymentApplyBoxTube(@Valid @RequestBody ApplyDTO dto);
 
 	/**
+	 * 海运进出口生成账单
+	 * @param dto
+	 * @return
+	 */
+	@PostMapping("settlement/paymentApplyOcean")
+	R paymentApplyOcean(@Valid @RequestBody ApplyDTO dto);
+
+	/**
 	 * 销售生成账单
 	 * @param dto
 	 * @return

+ 23 - 7
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/controller/ShippingBillController.java

@@ -17,6 +17,7 @@
 package org.springblade.box.tube.ocean.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -36,6 +37,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -86,15 +88,15 @@ public class ShippingBillController extends BladeController {
 	}
 
 	/**
-	 * 海运进、出口单据信息
+	 * 海运进、出口导出单据信息
 	 */
 	@GetMapping("/export")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入shippingBill")
-	public void export(ShippingBill shippingBill, HttpServletResponse response) {
-		List<ShippingBill> shippingBillDTOList = shippingBillService.list(Condition.getQueryWrapper(shippingBill));
+	public void export(ShippingBillDTO shippingBill, HttpServletResponse response) {
+		List<ShippingBillDTO> shippingBillDTOList = shippingBillService.selectShippingBillList(shippingBill);
 
-		ExcelUtil.export(response, "海运进、出口单据信息", "导出数据表", shippingBillDTOList, ShippingBill.class);
+		ExcelUtil.export(response, "海运进、出口单据信息", "导出数据表", ObjectUtils.isEmpty(shippingBillDTOList) ? new ArrayList<>() : shippingBillDTOList, ShippingBillDTO.class);
 	}
 
 	/**
@@ -135,7 +137,8 @@ public class ShippingBillController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(shippingBillService.removeByIds(Func.toLongList(ids)));
+		return shippingBillService.detele(Func.toLongList(ids));
+//		return R.status(shippingBillService.removeByIds(Func.toLongList(ids)));
 	}
 
 	/**
@@ -144,9 +147,9 @@ public class ShippingBillController extends BladeController {
 	 * @param shippingBill
 	 * @return
 	 */
-	@PostMapping("/checkTransport")
+	@PostMapping("/checkOcean")
 	@RepeatSubmit
-	public R checkTradingBox(@RequestBody ShippingBill shippingBill) {
+	public R checkOcean(@RequestBody ShippingBill shippingBill) {
 		ShippingBill check = shippingBillService.checkShippingBill(shippingBill);
 		return R.data(check);
 	}
@@ -180,4 +183,17 @@ public class ShippingBillController extends BladeController {
 		return R.data(shippingBillService.passCancel(id));
 	}
 
+	/**
+	 * 海运进出口撤销请核
+	 *
+	 * @param shippingBill
+	 * @return
+	 */
+	@PostMapping("/withdrawOcean")
+	@RepeatSubmit
+	public R withdrawOcean(@RequestBody ShippingBill shippingBill) {
+		ShippingBill check = shippingBillService.withdrawOcean(shippingBill);
+		return R.data(check);
+	}
+
 }

+ 26 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/controller/ShippingFeesController.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.box.tube.ocean.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -27,6 +28,8 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.finance.feign.IFinanceClient;
+import org.springblade.finance.vojo.Acc;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.box.tube.ocean.entity.ShippingFees;
@@ -34,6 +37,9 @@ import org.springblade.box.tube.ocean.vo.ShippingFeesVO;
 import org.springblade.box.tube.ocean.service.IShippingFeesService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * 海运进、出口费用信息 控制器
  *
@@ -48,6 +54,8 @@ public class ShippingFeesController extends BladeController {
 
 	private final IShippingFeesService shippingFeesService;
 
+	private final IFinanceClient financeClient;//财务
+
 	/**
 	 * 详情
 	 */
@@ -119,6 +127,24 @@ public class ShippingFeesController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		List<Long> toLongList = Func.toLongList(ids);
+		for (Long id : toLongList) {
+			//获取账单信息
+			Acc acc = new Acc();
+			acc.setTradeType("HY");
+			acc.setSrcType(11);
+			acc.setSrcFeesId(id);
+			R<List<Acc>> r = financeClient.getAccListByCondition(acc);
+			if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+				for (Acc acc_ : r.getData()) {
+					//判断账单是否已有结算  true 不允许撤销审核  false 删除账单并撤销审核
+					if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
+						throw new SecurityException("订单中费用已结算,不允许删除");
+					}
+				}
+			}
+		}
+
 		return R.status(shippingFeesService.removeByIds(Func.toLongList(ids)));
 	}
 

+ 1 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/mapper/ShippingBillMapper.java

@@ -41,4 +41,5 @@ public interface ShippingBillMapper extends BaseMapper<ShippingBill> {
 	 */
 	List<ShippingBillDTO> selectShippingBillPage(IPage page, @Param("shippingBill") ShippingBillDTO shippingBill);
 
+    List<ShippingBillDTO> selectShippingBillList(@Param("shippingBill") ShippingBillDTO shippingBill);
 }

+ 56 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/mapper/ShippingBillMapper.xml

@@ -136,5 +136,61 @@
         </if>
         ORDER BY osb.create_time
     </select>
+    <select id="selectShippingBillList" resultType="org.springblade.box.tube.ocean.dto.ShippingBillDTO">
+        SELECT
+        osb.*,
+        osbd.*
+        FROM
+        ocean_shipping_bill osb
+        LEFT JOIN ocean_shipping_bill_details osbd ON osb.id = osbd.pid
+        WHERE
+        osb.is_deleted = 0
+        <if test="shippingBill.sysNo != null and shippingBill.sysNo != ''">and osb.sys_no like concat('%',
+            #{shippingBill.sysNo},'%')
+        </if>
+        <if test="shippingBill.billType != null and shippingBill.billType != ''">and osb.bill_type
+            =#{shippingBill.billType}
+        </if>
+        <if test="shippingBill.tradeType != null and shippingBill.tradeType != ''">and osb.trade_type
+            =#{shippingBill.tradeType}
+        </if>
+        <if test="shippingBill.corpId != null">and osb.corp_id =#{shippingBill.corpId}</if>
+        <if test="shippingBill.shippingCompanyId != null">and osb.shipping_company_id
+            =#{shippingBill.shippingCompanyId}
+        </if>
+        <if test="shippingBill.bookingAgentId != null">and
+            osb.booking_agent=#{shippingBill.bookingAgentId}
+        </if>
+        <if test="shippingBill.station != null and shippingBill.station != ''">and osb.station
+            =#{shippingBill.station}
+        </if>
+        <if test="shippingBill.route != null and shippingBill.route != ''">and osb.route =#{shippingBill.route}</if>
+        <if test="shippingBill.businessSource != null and shippingBill.businessSource != ''">and osb.business_source =
+            #{shippingBill.businessSource}
+        </if>
+        <if test="shippingBill.sourceId != null">and osb.source_id = #{shippingBill.sourceId}</if>
+        <if test="shippingBill.mainBillNo != null and shippingBill.mainBillNo != ''">
+            and osbd.main_bill_no like concat('%', #{shippingBill.mainBillNo},'%')
+        </if>
+        <if test="shippingBill.branchBillNo != null and shippingBill.branchBillNo != ''">
+            and osbd.branch_bill_no like concat('%', #{shippingBill.branchBillNo},'%')
+        </if>
+        <if test="shippingBill.signingMethod != null and shippingBill.signingMethod != ''">
+            and osbd.signing_method = #{shippingBill.signingMethod}
+        </if>
+        <if test="shippingBill.sailDateList != null and shippingBill.sailDateList[0] != null and shippingBill.sailDateList[0]!= ''">
+            and osbd.sail_date &gt;= #{shippingBill.sailDateList[0]}
+        </if>
+        <if test="shippingBill.sailDateList != null and shippingBill.sailDateList[1] != null and shippingBill.sailDateList[1]!= ''">
+            and osbd.sail_date &lt;= #{shippingBill.sailDateList[1]}
+        </if>
+        <if test="shippingBill.actualSailDateList != null and shippingBill.actualSailDateList[0] != null and shippingBill.actualSailDateList[0]!= ''">
+            and osbd.actual_sail_date &gt;= #{shippingBill.actualSailDateList[0]}
+        </if>
+        <if test="shippingBill.actualSailDateList != null and shippingBill.actualSailDateList[1] != null and shippingBill.actualSailDateList[1]!= ''">
+            and osbd.actual_sail_date &lt;= #{shippingBill.actualSailDateList[1]}
+        </if>
+        ORDER BY osb.create_time
+    </select>
 
 </mapper>

+ 8 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/service/IShippingBillService.java

@@ -24,6 +24,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 
+import java.util.List;
+
 /**
  * 海运进、出口单据信息 服务类
  *
@@ -52,4 +54,10 @@ public interface IShippingBillService extends IService<ShippingBill> {
 	R underReview(Long id);
 
 	R passCancel(Long id);
+
+    ShippingBill withdrawOcean(ShippingBill shippingBill);
+
+	List<ShippingBillDTO> selectShippingBillList(ShippingBillDTO shippingBill);
+
+	R detele(List<Long> toLongList);
 }

+ 279 - 36
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/ocean/service/impl/ShippingBillServiceImpl.java

@@ -20,9 +20,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
-import org.springblade.box.tube.entity.Transport;
 import org.springblade.box.tube.ocean.dto.ShippingBillDTO;
 import org.springblade.box.tube.ocean.entity.*;
 import org.springblade.box.tube.ocean.mapper.*;
@@ -31,15 +32,27 @@ import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
 import org.springblade.check.entity.AuditPathsLevels;
 import org.springblade.check.feign.ICheckClient;
+import org.springblade.client.entity.Message;
+import org.springblade.client.feign.IMessageClient;
 import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.finance.dto.ApplyDTO;
+import org.springblade.finance.feign.IFinanceClient;
+import org.springblade.finance.vojo.Acc;
+import org.springblade.finance.vojo.Items;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -71,6 +84,12 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 
 	private final ICheckClient iCheckClient;
 
+	private final IFinanceClient financeClient;//财务
+
+	private final ISysClient sysClient;
+
+	private final IMessageClient messageClient;//消息
+
 	@Override
 	public IPage<ShippingBillDTO> selectShippingBillPage(IPage<ShippingBillDTO> page, ShippingBillDTO shippingBill) {
 		return page.setRecords(baseMapper.selectShippingBillPage(page, shippingBill));
@@ -107,22 +126,25 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public ShippingBill addOrUpdate(ShippingBill shippingBill) {
 
-		shippingBill.setShippingCompanyName(shippingBill.get$shippingCompanyId());//船公司
-		shippingBill.setCorpName(shippingBill.get$corpId());//客户
-		shippingBill.setConsigneeName(shippingBill.get$consigneeId());//收货人
-		shippingBill.setConsignorName(shippingBill.get$consignorId());//发货人
-		shippingBill.setBookingAgentName(shippingBill.get$bookingAgentId());//订舱代理
-		shippingBill.setAffiliatedCompanyName(shippingBill.get$affiliatedCompanyId());//所属公司
-		shippingBill.setDeliveryAddressName(shippingBill.get$deliveryAddressId());//交货地
-		shippingBill.setDeliverGoodsAddressName(shippingBill.get$deliverGoodsAddressId());//发货地
-		shippingBill.setDeptName(shippingBill.get$deptId());//部门
-		shippingBill.setDestinationName(shippingBill.get$destinationId());//目的地
-		shippingBill.setDischargeCargoHarborName(shippingBill.get$dischargeCargoHarborId());//卸货港
-		shippingBill.setNotifierName(shippingBill.get$notifierId());//通知人
-		shippingBill.setPreparedByName(shippingBill.get$preparedBy());//制单人
-		shippingBill.setLoadingPortName(shippingBill.get$loadingPortId());//装货港
+
+		shippingBill.setShippingCompanyName(ObjectUtils.isNull(shippingBill.getShippingCompanyName()) ? shippingBill.get$shippingCompanyId() : shippingBill.getShippingCompanyName());//船公司
+		shippingBill.setCorpName(ObjectUtils.isNull(shippingBill.getCorpName()) ? shippingBill.get$corpId() : shippingBill.getCorpName());//客户
+		shippingBill.setConsigneeName(ObjectUtils.isNull(shippingBill.getConsigneeName()) ? shippingBill.get$consigneeId() : shippingBill.getConsigneeName());//收货人
+		shippingBill.setConsignorName(ObjectUtils.isNull(shippingBill.getConsignorName()) ? shippingBill.get$consignorId() : shippingBill.getConsignorName());//发货人
+		shippingBill.setBookingAgentName(ObjectUtils.isNull(shippingBill.getBookingAgentName()) ? shippingBill.get$bookingAgentId() : shippingBill.getBookingAgentName());//订舱代理
+		shippingBill.setAffiliatedCompanyName(ObjectUtils.isNull(shippingBill.getAffiliatedCompanyName()) ? shippingBill.get$affiliatedCompanyId() : shippingBill.getAffiliatedCompanyName());//所属公司
+		shippingBill.setDeliveryAddressName(ObjectUtils.isNull(shippingBill.getDeliveryAddressName()) ? shippingBill.get$deliveryAddressId() : shippingBill.getDeliveryAddressName());//交货地
+		shippingBill.setDeliverGoodsAddressName(ObjectUtils.isNull(shippingBill.getDeliverGoodsAddressName()) ? shippingBill.get$deliverGoodsAddressId() : shippingBill.getDeliverGoodsAddressName());//发货地
+		shippingBill.setDeptName(ObjectUtils.isNull(shippingBill.getDeptName()) ? shippingBill.get$deptId() : shippingBill.getDeptName());//部门
+		shippingBill.setDestinationName(ObjectUtils.isNull(shippingBill.getDestinationName()) ? shippingBill.get$destinationId() : shippingBill.getDestinationName());//目的地
+		shippingBill.setDischargeCargoHarborName(ObjectUtils.isNull(shippingBill.getDischargeCargoHarborName()) ? shippingBill.get$dischargeCargoHarborId() : shippingBill.getDischargeCargoHarborName());//卸货港
+		shippingBill.setNotifierName(ObjectUtils.isNull(shippingBill.getNotifierName()) ? shippingBill.get$notifierId() : shippingBill.getNotifierName());//通知人
+		shippingBill.setPreparedByName(ObjectUtils.isNull(shippingBill.getPreparedByName()) ? shippingBill.get$preparedBy() : shippingBill.getPreparedByName());//制单人
+		shippingBill.setLoadingPortName(ObjectUtils.isNull(shippingBill.getLoadingPortName()) ? shippingBill.get$loadingPortId() : shippingBill.getLoadingPortName());//装货港
 
 		//单据信息
 		if (shippingBill.getId() == null) {
@@ -144,13 +166,13 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 		}
 		//明细
 		if (ObjectUtils.isNotNull(shippingBill.getShippingBillDetails())) {
-			shippingBill.getShippingBillDetails().setAccountingDeptName(shippingBill.getShippingBillDetails().get$accountingDeptId());//核算部门
-			shippingBill.getShippingBillDetails().setShipName(shippingBill.getShippingBillDetails().get$shipId());//船名
-			shippingBill.getShippingBillDetails().setBranchPayPlaceName(shippingBill.getShippingBillDetails().get$branchPayPlaceId());//分单付费地点
-			shippingBill.getShippingBillDetails().setGoodsName(shippingBill.getShippingBillDetails().get$goodsId());//货物
-			shippingBill.getShippingBillDetails().setOperatorName(shippingBill.getShippingBillDetails().get$operatorId());//操作员
-			shippingBill.getShippingBillDetails().setMainPayPlaceName(shippingBill.getShippingBillDetails().get$mainPayPlaceId());//主单付费地点
-			shippingBill.getShippingBillDetails().setVoyageNumber(shippingBill.getShippingBillDetails().get$voyageNumberId());//航次
+			shippingBill.getShippingBillDetails().setAccountingDeptName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getAccountingDeptName()) ? shippingBill.getShippingBillDetails().get$accountingDeptId() : shippingBill.getShippingBillDetails().getAccountingDeptName());//核算部门
+			shippingBill.getShippingBillDetails().setShipName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getShipName()) ? shippingBill.getShippingBillDetails().get$shipId() : shippingBill.getShippingBillDetails().getShipName());//船名
+			shippingBill.getShippingBillDetails().setBranchPayPlaceName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getBranchPayPlaceName()) ? shippingBill.getShippingBillDetails().get$branchPayPlaceId() : shippingBill.getShippingBillDetails().getBranchPayPlaceName());//分单付费地点
+			shippingBill.getShippingBillDetails().setGoodsName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getGoodsName()) ? shippingBill.getShippingBillDetails().get$goodsId() : shippingBill.getShippingBillDetails().getGoodsName());//货物
+			shippingBill.getShippingBillDetails().setOperatorName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getOperatorName()) ? shippingBill.getShippingBillDetails().get$operatorId() : shippingBill.getShippingBillDetails().getOperatorName());//操作员
+			shippingBill.getShippingBillDetails().setMainPayPlaceName(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getMainPayPlaceName()) ? shippingBill.getShippingBillDetails().get$mainPayPlaceId() : shippingBill.getShippingBillDetails().getMainPayPlaceName());//主单付费地点
+			shippingBill.getShippingBillDetails().setVoyageNumber(ObjectUtils.isNull(shippingBill.getShippingBillDetails().getVoyageNumber()) ? shippingBill.getShippingBillDetails().get$voyageNumberId() : shippingBill.getShippingBillDetails().getVoyageNumber());//航次
 			if (shippingBill.getShippingBillDetails().getId() == null) {
 				shippingBill.getShippingBillDetails().setCreateUser(AuthUtil.getUserId());
 				shippingBill.getShippingBillDetails().setCreateTime(new Date());
@@ -167,7 +189,6 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 		if (ObjectUtils.isNotNull(shippingBill.getShippingBoxTypeList())) {
 			int boxQuantity = 0;
 			for (ShippingBoxType shippingBoxType : shippingBill.getShippingBoxTypeList()) {
-				shippingBoxType.setBoxTypeName(shippingBoxType.get$boxTypeId());
 				if (shippingBoxType.getId() == null) {
 					shippingBoxType.setCreateUser(AuthUtil.getUserId());
 					shippingBoxType.setCreateTime(new Date());
@@ -187,10 +208,10 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 			shippingBill.setShippingBoxTypeNumber(boxQuantity);
 			//TEU
 			StringBuilder boxTypeNumber = new StringBuilder();
-			List<String> boxType = shippingBill.getShippingBoxTypeList().stream().filter(e -> ObjectUtils.isNotNull(e.getBoxTypeName())).map(ShippingBoxType::getBoxTypeName).distinct().collect(Collectors.toList());
+			List<String> boxType = shippingBill.getShippingBoxTypeList().stream().filter(e -> ObjectUtils.isNotNull(e.getBoxType())).map(ShippingBoxType::getBoxType).distinct().collect(Collectors.toList());
 			for (String boxType_ : boxType) {
 				if (ObjectUtils.isNotNull(boxType) && boxType.size() > 0) {
-					List<ShippingBoxType> boxTypeSize = shippingBill.getShippingBoxTypeList().stream().filter(e -> ObjectUtils.isNotNull(e.getBoxTypeName()) && e.getBoxTypeName().equals(boxType_)).collect(Collectors.toList());
+					List<ShippingBoxType> boxTypeSize = shippingBill.getShippingBoxTypeList().stream().filter(e -> ObjectUtils.isNotNull(e.getBoxType()) && e.getBoxType().equals(boxType_)).collect(Collectors.toList());
 					if (ObjectUtils.isNotNull(boxTypeSize) && boxTypeSize.size() > 0) {
 						boxTypeNumber.append(boxType_).append("X").append(boxTypeSize.size()).append(",");
 					}
@@ -203,7 +224,6 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 		//配箱信息
 		if (ObjectUtils.isNotNull(shippingBill.getShippingMatchBoxList())) {
 			for (ShippingMatchBox shippingMatchBox : shippingBill.getShippingMatchBoxList()) {
-				shippingMatchBox.setBoxTypeName(shippingMatchBox.get$boxTypeId());
 				if (shippingMatchBox.getId() == null) {
 					shippingMatchBox.setCreateUser(AuthUtil.getUserId());
 					shippingMatchBox.setCreateTime(new Date());
@@ -253,6 +273,8 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public ShippingBill checkShippingBill(ShippingBill shippingBill) {
 		ShippingBill selectShippingBill = baseMapper.selectById(shippingBill.getId());
 		//审批数据
@@ -279,7 +301,9 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 
 				auditProecessDTO.setProcessType("海运出口单据审批");
 				// 绑定审核类型
-				auditProecessDTO.setCheckType(shippingBill.getBillType() + "-DJ");
+				auditProecessDTO.setCheckType(selectShippingBill.getBillType() + "-DJ");
+				selectShippingBill.setStatus(1);
+
 			} else {
 				if (shippingBill.getCheckFlag() == 1 && selectShippingBill.getStatus() != 0) {
 					throw new SecurityException("订单已开启审核,请勿重复提交");
@@ -291,13 +315,13 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 
 				auditProecessDTO.setProcessType("海运出口费用审批");
 				// 绑定审核类型
-				auditProecessDTO.setCheckType(shippingBill.getBillType() + "-FY");
+				auditProecessDTO.setCheckType(selectShippingBill.getBillType() + "-FY");
 			}
 
 			/* 进口返程审批流程  */
 		} else if ("HYJK".equals(shippingBill.getBillType()) && checkFlag == 2) {
 			if (shippingBill.getApprovalType().equals("1")) {
-				if (shippingBill.getCheckFlag() == 1 && selectShippingBill.getStatus() != 0) {
+				if (shippingBill.getCheckFlag() == 2 && selectShippingBill.getStatus() != 0) {
 					throw new SecurityException("订单已开启审核,请勿重复提交");
 				}
 				//是否开启流程
@@ -307,9 +331,11 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 
 				auditProecessDTO.setProcessType("海运进口单据审批");
 				// 绑定审核类型
-				auditProecessDTO.setCheckType(shippingBill.getBillType() + "-DJ");
+				auditProecessDTO.setCheckType(selectShippingBill.getBillType() + "-DJ");
+				selectShippingBill.setStatus(1);
+
 			} else {
-				if (shippingBill.getCheckFlag() == 1 && selectShippingBill.getStatus() != 0) {
+				if (shippingBill.getCheckFlag() == 2 && selectShippingBill.getStatus() != 0) {
 					throw new SecurityException("订单已开启审核,请勿重复提交");
 				}
 				//是否开启流程
@@ -319,7 +345,7 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 
 				auditProecessDTO.setProcessType("海运进口费用审批");
 				// 绑定审核类型
-				auditProecessDTO.setCheckType(shippingBill.getBillType() + "-FY");
+				auditProecessDTO.setCheckType(selectShippingBill.getBillType() + "-FY");
 			}
 
 		} else {
@@ -330,9 +356,9 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 		if (pathsActs == null || pathsActs.getIsEnable() == 2) {
 			throw new SecurityException("当前租户未查询到审批流配置");
 		} else {
+			selectShippingBill.setFeeStatus("2");
 
 			//修改单据状态
-			selectShippingBill.setStatus(1);
 			baseMapper.updateById(selectShippingBill);
 
 			if (CollectionUtils.isEmpty(auditPathsLevels)) {
@@ -365,10 +391,14 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 			auditProecessDTO.setPayAmount(payAmount);
 			auditProecessDTO.setReceivableAmount(receivableAmount);
 			//审批数据
-			auditProecessDTO.setMorderNo(shippingBill.getShippingBillDetails().getContractNo());
+			LambdaQueryWrapper<ShippingBillDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(ShippingBillDetails::getPid,selectShippingBill.getId());
+			ShippingBillDetails shippingBillDetails = shippingBillDetailsMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtils.isNotNull(shippingBillDetails)){
+				auditProecessDTO.setMorderNo(shippingBillDetails.getContractNo());
+			}
 			auditProecessDTO.setOrderRemark(shippingBill.getRemarks());
 			auditProecessDTO.setCorpId(shippingBill.getCorpId());
-			auditProecessDTO.setCheckType(shippingBill.getBillType());
 			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
 			auditProecessDTO.setActId(1);
 			auditProecessDTO.setSrcBillId(shippingBill.getId());
@@ -392,9 +422,10 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 			throw new SecurityException("审批通过失败");
 		}
 		shippingBill.setStatus(3);
+		shippingBill.setFeeStatus("1");
 		baseMapper.updateById(shippingBill);
 		//入库生成账单
-//		this.paymentApply(shippingBill, shippingBill.getBillType(), shippingBill.getBillType());
+		this.paymentApply(shippingBill, shippingBill.getBillType(), shippingBill.getBillType());
 		return R.success("操作成功");
 	}
 
@@ -416,8 +447,220 @@ public class ShippingBillServiceImpl extends ServiceImpl<ShippingBillMapper, Shi
 			throw new SecurityException("审批通过失败");
 		}
 		shippingBill.setStatus(0);
+		shippingBill.setFeeStatus("0");
 		baseMapper.updateById(shippingBill);
 		return R.success("操作成功");
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public ShippingBill withdrawOcean(ShippingBill shippingBill) {
+		ShippingBill selectShippingBill = baseMapper.selectById(shippingBill.getId());
+		if (selectShippingBill == null) {
+			throw new SecurityException("撤销审核失败");
+		}
+		//获取账单信息
+		Acc acc = new Acc();
+		acc.setTradeType(selectShippingBill.getTradeType());
+		acc.setSrcType(11);
+		acc.setSrcParentId(selectShippingBill.getId());
+		if (shippingBill.getApprovalType().equals("2")) {
+			if (ObjectUtils.isNotNull(shippingBill.getShippingFeesList()) && shippingBill.getShippingFeesList().size() > 0) {
+				for (ShippingFees shippingFees : shippingBill.getShippingFeesList()) {
+					acc.setSrcFeesId(shippingFees.getId());
+					R<List<Acc>> r = financeClient.getAccListByCondition(acc);
+					if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+						for (Acc acc_ : r.getData()) {
+							//判断账单是否已有结算  true 不允许撤销审核  false 删除账单并撤销审核
+							if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
+								throw new SecurityException("订单已结算,不允许撤销");
+							} else {
+								financeClient.remove(acc_.getId() + "");
+							}
+						}
+					}
+					shippingFees.setSubmitPay(0);
+					shippingFeesMapper.updateById(shippingFees);
+				}
+			} else {
+				throw new SecurityException("撤销失败,请选择费用明细");
+			}
+		} else {
+			R<List<Acc>> r = financeClient.getAccListByCondition(acc);
+			if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+				for (Acc acc_ : r.getData()) {
+					//判断账单是否已有结算  true 不允许撤销审核  false 删除账单并撤销审核
+					if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
+						throw new SecurityException("订单已结算,不允许撤销");
+					} else {
+						financeClient.remove(acc_.getId() + "");
+					}
+				}
+			}
+			selectShippingBill.setStatus(0);
+			selectShippingBill.setUpdateTime(new Date());
+			selectShippingBill.setUpdateUser(AuthUtil.getUserId());
+			baseMapper.updateById(selectShippingBill);
+			//获取订单费用信息
+			LambdaQueryWrapper<ShippingFees> shippingFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			shippingFeesLambdaQueryWrapper.eq(ShippingFees::getIsDeleted, 0)
+				.eq(ShippingFees::getPid, selectShippingBill.getId())
+				.eq(ShippingFees::getTenantId, AuthUtil.getTenantId())
+				.eq(ShippingFees::getIsCheck, 1)
+				.eq(ShippingFees::getSubmitPay, 1);
+			List<ShippingFees> shippingFeesList = shippingFeesMapper.selectList(shippingFeesLambdaQueryWrapper);
+			for (ShippingFees shippingFees : shippingFeesList) {
+				shippingFees.setSubmitPay(0);
+				shippingFeesMapper.updateById(shippingFees);
+			}
+		}
+
+//		iCheckClient.deteleByBillId(selectTransport.getId());
+		return selectShippingBill;
+	}
+
+	@Override
+	public List<ShippingBillDTO> selectShippingBillList(ShippingBillDTO shippingBill) {
+		return baseMapper.selectShippingBillList(shippingBill);
+	}
+
+	@Override
+	public R detele(List<Long> toLongList) {
+		for (Long id : toLongList) {
+			//获取账单信息
+			Acc acc = new Acc();
+			acc.setTradeType("HY");
+			acc.setSrcType(11);
+			acc.setSrcParentId(id);
+			R<List<Acc>> r = financeClient.getAccListByCondition(acc);
+			if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+				for (Acc acc_ : r.getData()) {
+					//判断账单是否已有结算  true 不允许撤销审核  false 删除账单并撤销审核
+					if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
+						throw new SecurityException("订单中费用已结算,不允许删除");
+					}
+				}
+			}
+			baseMapper.deleteById(id);
+		}
+		return R.status(true);
+	}
+
+
+	/**
+	 * 订单生成账单 并且推送财务消息
+	 *
+	 * @param billType 货款类型: 申请 收费 付费
+	 * @param itemType 付款类型: 采购 销售 收货 发货
+	 */
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public void paymentApply(ShippingBill shippingBill, String billType, String itemType) {
+		Long pid = shippingBill.getId();
+
+		//账单数据
+		ApplyDTO applyDTO = new ApplyDTO();
+		applyDTO.setTradeType(shippingBill.getTradeType());
+		BigDecimal amount = BigDecimal.ZERO;//对账金额   销售订单生成的金额  销售金额-本次使用返利金额+费用明细
+		BigDecimal quantity = new BigDecimal("1");//对账数量 数量为 就是轮胎条数的和
+		BigDecimal price = BigDecimal.ZERO;//对账单价
+
+		//获取订单收款信息
+		LambdaQueryWrapper<ShippingFees> shippingFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		shippingFeesLambdaQueryWrapper.eq(ShippingFees::getIsDeleted, 0)
+			.eq(ShippingFees::getPid, pid)
+			.eq(ShippingFees::getTenantId, AuthUtil.getTenantId())
+			.eq(ShippingFees::getSubmitPay, 0)
+			.eq(ShippingFees::getIsCheck, 2);
+		List<ShippingFees> shippingFeesList = shippingFeesMapper.selectList(shippingFeesLambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(shippingFeesList)) {
+			List<Items> itemsList = new ArrayList<>();
+			for (ShippingFees shippingFees : shippingFeesList) {
+				Items items = new Items();
+				amount = shippingFees.getAmount();
+				//计算单价
+				if (quantity.compareTo(BigDecimal.ZERO) > 0) {
+					price = amount.divide(quantity, 5, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+				}
+				if (1 == shippingFees.getFeesType()) {
+					items.setSrcFeesType("收费");
+				} else {
+					items.setSrcFeesType("申请");
+				}
+				items.setSrcBoxBillType(shippingBill.getBillType());
+				items.setItemType(itemType);
+				items.setPrice(price);
+				//账单数据
+				items.setAmount(amount);
+				items.setQuantity(quantity);
+				items.setSrcOrderno(shippingBill.getSysNo());
+				items.setCorpId(shippingFees.getCorpId());
+				items.setSrcParentId(pid);
+				items.setCurrency(shippingFees.getCurrency());
+				items.setSrcType(11);
+				items.setTradeType(shippingBill.getTradeType());
+				items.setUnit(shippingFees.getUnit());
+				items.setSrcSysNo(shippingBill.getSysNo());
+				items.setRemarks(shippingFees.getRemarks());
+				items.setSrcBillNo(shippingBill.getShippingBillDetails().getMainBillNo());
+				items.setStatusJT(0);
+				items.setBillNo(shippingBill.getShippingBillDetails().getMainBillNo());
+				items.setStockTime(shippingBill.getPreparationDate());
+				items.setDepartureHarbor(shippingBill.getLoadingPortName());
+				items.setObjectiveHarbor(shippingBill.getDestinationName());
+				items.setShipName(shippingBill.getShippingBillDetails().getShipName());
+				items.setVoyageNumber(shippingBill.getShippingBillDetails().getVoyageNumber());
+				items.setSailDate(shippingBill.getShippingBillDetails().getSailDate());
+				//获取费用id
+				if (ObjectUtils.isNotNull(shippingFees.getItemId())) {
+					items.setCostType(shippingFees.getItemId().toString());
+				}
+				items.setSrcFeesId(shippingFees.getId());
+				itemsList.add(items);
+				applyDTO.setItemsList(itemsList);
+
+				//修改费用明细
+				shippingFees.setSubmitPay(1);
+				shippingFees.setIsCheck(1);
+				shippingFeesMapper.updateById(shippingFees);
+			}
+			if (CollectionUtils.isNotEmpty(itemsList)) {
+				//生成账单
+				R paymentApply = financeClient.paymentApplyBoxTube(applyDTO);
+				if (!paymentApply.isSuccess()) {
+					throw new RuntimeException(paymentApply.getMsg());
+				}
+				//给角色为财务的人发送消息
+				R<String> clientDeptIds = sysClient.getRoleIds(SecureUtil.getTenantId(), "财务");
+				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
+					R<List<User>> userList = userClient.listUserByRoleId(Long.valueOf(clientDeptIds.getData()));
+					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
+						for (User datum : userList.getData()) {
+							//循环发送消息
+							Message sendMessage = new Message();
+							sendMessage.setParameter(String.valueOf(pid));
+							sendMessage.setUserName(AuthUtil.getUserName());
+							sendMessage.setUserId(AuthUtil.getUserId());
+							sendMessage.setToUserId(datum.getId());
+							sendMessage.setToUserName(datum.getName());
+							sendMessage.setMessageType(1);
+							sendMessage.setTenantId(AuthUtil.getTenantId());
+							sendMessage.setCreateUser(AuthUtil.getUserId());
+							sendMessage.setCreateTime(new Date());
+							sendMessage.setUrl(shippingBill.getUrl());
+							sendMessage.setPageLabel(shippingBill.getPageLabel());
+							sendMessage.setPageStatus(shippingBill.getPageStatus());
+							sendMessage.setMessageBody("您订单" + shippingBill.getSysNo() + "审核通过,请查看");
+							R save = messageClient.save(sendMessage);
+							if (!save.isSuccess()) {
+								throw new SecurityException("发送消息失败");
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
 }

+ 2 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java

@@ -17,6 +17,7 @@
 package org.springblade.box.tube.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -1664,7 +1665,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getTenantId, AuthUtil.getTenantId());
 			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getSubmitPay, 1);
 			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getCode, tradingBoxItem.getCode());
-			tradingBoxFeesLambdaQueryWrapper.orderByDesc(TradingBoxFees::getCreateTime);
+			tradingBoxFeesLambdaQueryWrapper.orderByDesc(TradingBoxFees::getRentEndDate);
 			List<TradingBoxFees> tradingBoxFeesList = tradingBoxFeesMapper.selectList(tradingBoxFeesLambdaQueryWrapper);
 			if (tradingBoxFeesList.size() > 0) {
 				tradingBoxFeesMapper.deleteById(tradingBoxFeesList.get(0).getId());

+ 215 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java

@@ -31,6 +31,7 @@ import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.box.tube.entity.*;
 import org.springblade.box.tube.feign.*;
+import org.springblade.box.tube.ocean.entity.ShippingBill;
 import org.springblade.box.tube.ocean.fegin.IOceanShippingBillClient;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
@@ -4376,7 +4377,221 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 
 	@Override
 	public void oceanShipping(AuditProecess auditProecess) {
+//查看最新操作记录,防止重复提交
+		AuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
+		if (proecessTemp == null) {
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if ("A".equals(proecessTemp.getAuditStatus()) || "B".equals(proecessTemp.getAuditStatus())) {
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if (auditProecess.getAuditStatus() == null || !"S".equals(auditProecess.getAuditStatus())) {
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage = new Message();
+		sendMessage.setParameter(String.valueOf(auditProecess.getBillId()));
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+		//不是最后一级
+		if ("F".equals(iffinalItem)) {
+
+			//通过
+			if (operate == 1) {
+				//如果是第一级, 则修改状态为审批中
+				if (auditProecess.getLevelId() == 1) {
+					R submit = oceanShippingBillClient.underReviewOceanShippingBill(auditProecess.getSrcBillId());
+					if (!submit.isSuccess()) {
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<AuditProecess> auditProecessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(AuditProecess::getBatchNo, auditProecess.getBatchNo())
+					.eq(AuditProecess::getSrcBillId, auditProecess.getSrcBillId())
+					.eq(AuditProecess::getIsDelete, 0)
+					.eq(AuditProecess::getActId, auditProecess.getActId())
+					.eq(AuditProecess::getBillId, auditProecess.getBillId())
+					.eq(AuditProecess::getBillNo, auditProecess.getBillNo())
+					.eq(AuditProecess::getTenantId, AuthUtil.getTenantId())
+					.eq(AuditProecess::getLevelId, auditProecess.getLevelId() + 1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if (count != null && count > 1) {
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				AuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if (proecess == null) {
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
+				String corpName = null;
+				if (proecessTemp.getCorpId() != null) {
+					R<CorpsDesc> corpMessage = iCorpsDescClient.getCorpMessage(proecessTemp.getCorpId());
+					if (corpMessage.isSuccess() && corpMessage.getData() != null) {
+						corpName = corpMessage.getData().getCname();
+					}
+				}
+				String transportDate = null;
+				if (proecessTemp.getBillId() != null) {
+					ShippingBill shippingBill = oceanShippingBillClient.getOceanShippingBillById(proecessTemp.getBillId());
+					if (shippingBill != null) {
+						transportDate = simpleDateFormat.format(shippingBill.getCreateTime());
+					}
+				}
+				Message message = new Message();
+				message.setParameter(String.valueOf(auditProecess.getBillId()));
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
 
+				//判断模板类型
+				if ("海运出口单据审批".equals(proecessTemp.getProcessType())) {
+					message.setMessageBody("您有海运出口单据审批,客户名:" + corpName + "," + "业务单号:" +
+						"" + proecessTemp.getBillNo() + "," + "订单日期:" + transportDate + ",请审核。"
+						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+					);
+				} else if ("海运出口费用审批".equals(proecessTemp.getProcessType())) {
+					message.setMessageBody("您有海运出口费用审批,客户名:" + corpName + "," + "业务单号:" +
+						"" + proecessTemp.getBillNo() + "," + "订单日期:" + transportDate + ",请审核。"
+						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+					);
+				}
+				else if ("海运进口单据审批".equals(proecessTemp.getProcessType())) {
+					message.setMessageBody("您有海运进口单据审批,客户名:" + corpName + "," + "业务单号:" +
+						"" + proecessTemp.getBillNo() + "," + "订单日期:" + transportDate + ",请审核。"
+						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+					);
+				}
+				else if ("海运进口费用审批".equals(proecessTemp.getProcessType())) {
+					message.setMessageBody("您有海运进口费用审批,客户名:" + corpName + "," + "业务单号:" +
+						"" + proecessTemp.getBillNo() + "," + "订单日期:" + transportDate + ",请审核。"
+						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+					);
+				}
+
+				message.setCreateUser(AuthUtil.getUserId());
+				message.setUrl("/approveData/index");
+				message.setCreateTime(new Date());
+
+				// 消息批量通知下一级
+				sendMsgToGroup(message, proecess.getAuditUserId());
+			}
+			//不通过
+			else if (operate == 2) {
+				auditProecess.setAuditStatus("B");
+				//todo 调用feign取消
+				R r = oceanShippingBillClient.passCancelOceanShippingBill(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改审核状态失败");
+				}
+
+				if ("海运出口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口单据审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				} else if ("海运出口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口费用审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+				else if ("海运进口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口单据审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+				else if ("海运进口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口费用审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if ("T".equals(iffinalItem)) {
+			//通过
+			if (operate == 1) {
+				//todo 调用feign直接通过
+				auditProecess.setAuditStatus("A");
+				R r = oceanShippingBillClient.passCancelOceanShippingBill(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException(r.getMsg());
+				}
+
+				if ("海运出口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口单据审批已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				} else if ("海运出口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口费用审批已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				}else if ("海运进口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口单据审批已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				}else if ("海运进口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口费用审批已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				}
+
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if (operate == 2) {
+				//todo 调用feign取消
+				auditProecess.setAuditStatus("B");
+				R r = oceanShippingBillClient.passCancelOceanShippingBill(auditProecess.getSrcBillId());
+
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改审核状态失败");
+				}
+				if ("海运出口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口单据审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				} else if ("海运出口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运出口费用审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+				else if ("海运进口单据审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口单据审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+				else if ("海运进口费用审批".equals(proecessTemp.getProcessType())) {
+					sendMessage.setMessageBody("您的海运进口费用审批未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				}
+
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		} else {
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+
+		cleanMsg(proecessTemp.getAuditUserId(), AuthUtil.getUserId(), proecessTemp.getSrcBillId());
+
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
 	}
 
 	private void sendMsgToGroup(Message message, String group) {

+ 11 - 0
blade-service/trade-finance/src/main/java/org/springblade/finance/controller/SettlementController.java

@@ -831,6 +831,17 @@ public class SettlementController extends BladeController {
 	}
 
 	/**
+	 * 海运进出口生成账单
+	 */
+	@PostMapping("/paymentApplyOcean")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "海运进出口生成账单", notes = "传入对象")
+	public R paymentApplyOcean(@RequestBody ApplyDTO dto) {
+		settlementService.paymentApplyOcean(dto.getItemsList(), dto.getTradeType());
+		return R.success("操作成功");
+	}
+
+	/**
 	 * 收付款(陆运)
 	 */
 	@PostMapping("/paymentApplyLandOrder")

+ 2 - 0
blade-service/trade-finance/src/main/java/org/springblade/finance/service/ISettlementService.java

@@ -106,4 +106,6 @@ public interface ISettlementService extends IService<Settlement> {
     void paymentApplyBoxTube(List<Items> itemsList, String billType, String belongCompany, String tradeType);
 
 	void paymentApplyLandOrder(List<Items> itemsList);
+
+    void paymentApplyOcean(List<Items> itemsList, String tradeType);
 }

+ 78 - 1
blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

@@ -39,6 +39,8 @@ import org.springblade.box.tube.feign.IDeclareCustomsClient;
 import org.springblade.box.tube.feign.IRepairClient;
 import org.springblade.box.tube.feign.ITradingBoxClient;
 import org.springblade.box.tube.feign.ITransportClient;
+import org.springblade.box.tube.ocean.entity.ShippingFees;
+import org.springblade.box.tube.ocean.fegin.IOceanShippingBillClient;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
 import org.springblade.check.entity.AuditPathsLevels;
@@ -144,6 +146,8 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 
 	private final ILandClient landClient;
 
+	private final IOceanShippingBillClient oceanShippingBillClient;
+
 	private final IDeclareCustomsClient declareCustomsClient;
 
 	/**
@@ -751,6 +755,27 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 			orderFeeR.getData().setSettlementAmount(decimal);
 			orderFeeR.getData().setSettlementDate(null);
 			landClient.updateOrderFee(orderFeeR.getData());
+		}else if (type == 11) {
+			Long srcFeesId = acc.getSrcFeesId();
+			if (srcFeesId == null) {
+				throw new SecurityException("操作失败,未获取到原业务信息");
+			}
+
+			R<ShippingFees> shippingFeesR = oceanShippingBillClient.getOceanShippingFeesById(srcFeesId);
+			if (!shippingFeesR.isSuccess() && ObjectUtils.isNull(shippingFeesR.getData())) {
+				throw new SecurityException("修改原单据失败");
+			}
+			//回退原业务表数据
+			if (shippingFeesR.getData().getSettlementAmount() == null) {
+				throw new SecurityException("撤销账单失败,原业务表已收金额为空");
+			}
+			BigDecimal decimal = shippingFeesR.getData().getSettlementAmount().subtract(items.getThisAmount());
+			if (decimal.compareTo(BigDecimal.ZERO) < 0) {
+				throw new SecurityException("撤销账单失败,剩余已收金额不够本次扣款");
+			}
+			shippingFeesR.getData().setSettlementAmount(decimal);
+			shippingFeesR.getData().setSettlementDate(null);
+			oceanShippingBillClient.updateOceanShippingFees(shippingFeesR.getData());
 		}
 
 	}
@@ -988,7 +1013,21 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 			accMapper.updateById(acc);
 			orderFeeR.getData().setSettlementDate(new Date());
 			landClient.updateOrderFee(orderFeeR.getData());
-		} else {
+		} else if (type == 11) {
+			Long srcFeesId = acc.getSrcFeesId();
+			if (srcFeesId == null) {
+				throw new SecurityException("操作失败,未获取到原业务信息");
+			}
+			R<ShippingFees> shippingFeesR = oceanShippingBillClient.getOceanShippingFeesById(srcFeesId);
+			if (!shippingFeesR.isSuccess() && ObjectUtils.isNull(shippingFeesR.getData())) {
+				throw new SecurityException("修改原单据失败");
+			}
+			acc.setSettlementAmount(acc.getSettlementAmount() != null ? acc.getSettlementAmount().add(items.getThisAmount()) : new BigDecimal("0").add(items.getThisAmount()));
+			shippingFeesR.getData().setSettlementAmount(shippingFeesR.getData().getSettlementAmount() != null ? shippingFeesR.getData().getSettlementAmount().add(items.getThisAmount()) : new BigDecimal("0").add(items.getThisAmount()));
+			accMapper.updateById(acc);
+			shippingFeesR.getData().setSettlementDate(new Date());
+			oceanShippingBillClient.updateOceanShippingFees(shippingFeesR.getData());
+		}else {
 			throw new SecurityException("操作失败,财务类型为空无法结算");
 		}
 
@@ -2870,4 +2909,42 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 			}
 		});
 	}
+
+	@Override
+	public void paymentApplyOcean(List<Items> itemsList, String tradeType) {
+		itemsList.forEach(e -> {
+			Acc acc = new Acc();
+			BeanUtils.copyProperties(e, acc);
+			acc.setBillType(e.getSrcFeesType());
+			if ("收费".equals(e.getSrcFeesType())) {
+				acc.setDc("d");
+			} else {
+				acc.setDc("c");
+			}
+			acc.setItemType(e.getItemType());
+			acc.setAccSysNo(e.getSrcOrderno());
+			acc.setSrcRefno(e.getSrcOrderno());
+			acc.setSrcParentId(e.getSrcParentId());
+			acc.setSrcBillNo(e.getBillNo());
+			acc.setCreateTime(new Date());
+			acc.setTradeType(e.getTradeType());
+			acc.setSrcSysno(e.getSrcSysNo());
+			if (ObjectUtils.isNotNull(e.getStatusJT())) {
+				acc.setStatus(e.getStatusJT());
+			} else {
+				acc.setStatus(0);
+			}
+			acc.setRemarks(e.getRemarks());
+			acc.setCostType(e.getCostType());
+			acc.setCreateUser(AuthUtil.getUserId());
+			acc.setSrcType(e.getSrcType());
+			acc.setSrcFeesId(e.getSrcFeesId());
+			acc.setDepartureHarbor(e.getDepartureHarbor());
+			acc.setObjectiveHarbor(e.getObjectiveHarbor());
+			acc.setShipName(e.getShipName());
+			acc.setVoyageNumber(e.getVoyageNumber());
+			acc.setSailDate(e.getSailDate());
+			accMapper.insert(acc);
+		});
+	}
 }