Преглед изворни кода

Merge remote-tracking branch 'origin/master'

xiongwanxiong пре 2 дана
родитељ
комит
3435d7ebb6

+ 89 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/ChemicalsEntryController.java

@@ -0,0 +1,89 @@
+package cn.gov.customs.wxjy.analyze.controller;
+
+import cn.gov.customs.cacp.sdks.core.result.Result;
+import cn.gov.customs.cacp.sdks.core.user.annotation.LogonUser;
+import cn.gov.customs.cacp.sdks.core.user.pojo.CacpLogonUser;
+import cn.gov.customs.wxjy.analyze.pojo.*;
+import cn.gov.customs.wxjy.analyze.service.IGoodsEntryService;
+import cn.gov.customs.wxjy.common.core.controller.BaseController;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import cn.gov.customs.wxjy.common.utils.poi.DynamicExcelUtil;
+import cn.gov.customs.wxjy.base.service.BaseCodeService;
+import cn.gov.customs.wxjy.system.service.DictDataService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 危险品报关单头Controller
+ * @author xiong
+ * @date 2025-12-04
+ */
+@RestController
+@RequestMapping("/analyze/chemicalsEntry")
+@RequiredArgsConstructor
+public class ChemicalsEntryController extends BaseController {
+
+    private final IGoodsEntryService service;
+    private final BaseCodeService baseCodeService;
+    private final DictDataService dictDataService;
+
+    @GetMapping("/get-entry")
+    public Result<EntryInfo> getEntryHead(@RequestParam String entryId) {
+        EntryHead head = this.service.selectByEntryId(entryId);
+        EntryInfo info = new EntryInfo();
+        info.setInfo(head);
+        List<EntryList> list = this.service.getEntryList(entryId);
+        info.setList(list);
+        return Result.success(info);
+    }
+
+    /**
+     * 查询危险品报关单头列表
+     */
+    @PostMapping("/get-list")
+    public Result<PageInfo<Entry>> list(@LogonUser CacpLogonUser user, @RequestBody EntryQuery query) {
+        PageHelper.startPage(query.getPageIndex(), query.getPageSize());
+        String customsCode = user.getCustomsCode();
+        //总关查所有,判断是否为总关用户
+        if(StringUtils.isEmpty(query.getCustomsCode())){
+            if(!"4700".equals(customsCode)){
+                query.setCustomsCode(customsCode);
+            }
+        }
+        PageInfo<Entry> list = this.service.selectPageList(query);
+        return Result.success(list);
+    }
+
+    /**
+     * 导出危险品报关单头列表
+     */
+    @PostMapping("/goods-export")
+    public void export(@LogonUser CacpLogonUser user, HttpServletResponse response, @RequestBody EntryQuery query) throws IOException {
+        String customsCode = user.getCustomsCode();
+        // 获取前端传递的动态列配置
+        String exportHeadList = query.getExportHeadList();
+        //总关查所有,判断是否为总关用户
+        if(StringUtils.isEmpty(query.getCustomsCode())){
+            if(!"4700".equals(customsCode)){
+                query.setCustomsCode(customsCode);
+            }
+        }
+        List<Entry> list = this.service.exportList(query);
+        list.forEach(excel -> {
+            excel.setTrafMode(baseCodeService.getTransByCode(excel.getTrafMode())==null?"":baseCodeService.getTransByCode(excel.getTrafMode()).getTrafSpec());
+            excel.setTradeMode(baseCodeService.getTradeByCode(excel.getTradeMode())==null?"":baseCodeService.getTradeByCode(excel.getTradeMode()).getAbbrTrade());
+            excel.setIePort(baseCodeService.getCustomsByCode(excel.getIePort())==null?"":baseCodeService.getCustomsByCode(excel.getIePort()).getCustomsName());
+            excel.setTradeCountry(baseCodeService.getCountryByIso(excel.getTradeCountry())==null?"":baseCodeService.getCountryByIso(excel.getTradeCountry()).getCounCName());
+            excel.setGoodsType(dictDataService.selectDictLabel("goods_type",excel.getGoodsType()));
+        });
+        // 使用动态Excel工具类
+        DynamicExcelUtil<Entry> util = new DynamicExcelUtil<>(Entry.class);
+        util.exportExcel(response, list, "危化品组合查询数据","",exportHeadList);
+    }
+}

+ 13 - 3
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/GoodsEntryController.java

@@ -9,7 +9,10 @@ import cn.gov.customs.cacp.sdks.core.user.annotation.LogonUser;
 import cn.gov.customs.cacp.sdks.core.user.pojo.CacpLogonUser;
 import cn.gov.customs.wxjy.analyze.pojo.EntryInfo;
 import cn.gov.customs.wxjy.analyze.pojo.EntryList;
+import cn.gov.customs.wxjy.base.service.BaseCodeService;
+import cn.gov.customs.wxjy.common.utils.DictUtils;
 import cn.gov.customs.wxjy.common.utils.poi.DynamicExcelUtil;
+import cn.gov.customs.wxjy.system.service.DictDataService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 import cn.gov.customs.wxjy.common.core.controller.BaseController;
@@ -19,7 +22,6 @@ import cn.gov.customs.wxjy.analyze.pojo.Entry;
 import cn.gov.customs.wxjy.analyze.pojo.EntryHead;
 import cn.gov.customs.wxjy.analyze.pojo.EntryQuery;
 import cn.gov.customs.wxjy.analyze.service.IGoodsEntryService;
-import cn.gov.customs.wxjy.common.utils.poi.ExcelUtil;
 import cn.gov.customs.wxjy.common.utils.StringUtils;
 
 /**
@@ -33,6 +35,8 @@ import cn.gov.customs.wxjy.common.utils.StringUtils;
 public class GoodsEntryController extends BaseController {
 
     private final IGoodsEntryService service;
+    private final BaseCodeService baseCodeService;
+    private final DictDataService dictDataService;
 
     @GetMapping("/get-entry")
     public Result<EntryInfo> getEntryHead(@RequestParam String entryId) {
@@ -76,9 +80,15 @@ public class GoodsEntryController extends BaseController {
             }
         }
         List<Entry> list = this.service.exportList(query);
-//        ExcelUtil<Entry> util = new ExcelUtil<Entry>(Entry.class);
+        list.forEach(excel -> {
+            excel.setTrafMode(baseCodeService.getTransByCode(excel.getTrafMode())==null?"":baseCodeService.getTransByCode(excel.getTrafMode()).getTrafSpec());
+            excel.setTradeMode(baseCodeService.getTradeByCode(excel.getTradeMode())==null?"":baseCodeService.getTradeByCode(excel.getTradeMode()).getAbbrTrade());
+            excel.setIePort(baseCodeService.getCustomsByCode(excel.getIePort())==null?"":baseCodeService.getCustomsByCode(excel.getIePort()).getCustomsName());
+            excel.setTradeCountry(baseCodeService.getCountryByIso(excel.getTradeCountry())==null?"":baseCodeService.getCountryByIso(excel.getTradeCountry()).getCounCName());
+            excel.setGoodsType(dictDataService.selectDictLabel("goods_type",excel.getGoodsType()));
+        });
         // 使用动态Excel工具类
         DynamicExcelUtil<Entry> util = new DynamicExcelUtil<>(Entry.class);
-        util.exportExcel(response, list, "危险品报关单数据","",exportHeadList);
+        util.exportExcel(response, list, "危险货物组合查询数据","",exportHeadList);
     }
 }

+ 98 - 46
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/Entry.java

@@ -1,13 +1,14 @@
 package cn.gov.customs.wxjy.analyze.pojo;
 
 import cn.gov.customs.wxjy.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * @description 法检报关单表头
@@ -24,89 +25,95 @@ public class Entry implements Serializable {
   @Excel(name = "报关单号",sort=1)
   private String entryId;
   /** 维护状态 */
-  @Excel(name = "维护状态",sort=2)
   private String mainStatus;
 
   /** 通关模式 */
-  @Excel(name = "通关模式",sort=3)
+  @Excel(name = "通关模式",dictType = "pass_mode",sort=2)
   private String passMode;
 
   // 运输方式 2:水运 3:铁路 4:公路 5:空运 6:邮件 9:其它
-  @Excel(name = "运输方式",sort=4)
+  @Excel(name = "运输方式",sort=3)
   private String trafMode;
 
   // 出入境标志 I:入境 E:出境
-  @Excel(name = "出入境标志",dictType = "ie_flag")
+  @Excel(name = "出入境标志",dictType = "ie_flag",sort=4)
   private String ieFlag;
 
   // 进出境口岸:4位
-  @Excel(name = "进出境口岸")
+  @Excel(name = "进出境口岸",sort=5)
   private String iePort;
 
   // 申报口岸:业务现场关区代码:4位
-  @Excel(name = "申报口岸")
   private String declPort;
 
   // 所属海关:4位
-  @Excel(name = "所属海关")
+  @Excel(name = "隶属海关",dictType = "affiliation_customs_info",sort=6)
   private String customsCode;
 
   // 货物运抵(进出口)时间
-  @Excel(name = "货物运抵(进出口)时间")
-  private LocalDateTime ieDate;
+  @Excel(name = "进出口时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=7)
+  private Date ieDate;
 
   // 申报时间
-  @Excel(name = "申报时间")
-  private LocalDateTime declDate;
+  @Excel(name = "申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=8)
+  private Date declDate;
 
   /** 是否提前申报标记 */
-  @Excel(name = "申报标记")
+  @Excel(name = "是否提前申报",dictType = "yes_no",sort=9)
   private String declAdvanceFlag;
 
   /** 自动受理时间 */
-  @Excel(name = "自动受理时间")
-  private LocalDateTime acceptDate;
+  @Excel(name = "自动受理时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=10)
+  private Date acceptDate;
 
   // 自动受理时间:对应ENTRY_WORKFLOW表STEP_ID='10000000'节点
   // TODO
   // 注:(用户建议)对于提前申报的单子,由于货物出入境日期晚于申报日期,自动受理时间会早于货物出入境日期,这种情况将自动受理时间重新赋值为货物出入境日期
-  private LocalDateTime exInPortDate;
+  @Excel(name = "货物进港时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=11)
+  private Date exInPortDate;
 
   // 境内收发货人代码
   private String consignScc;
-
+  @Excel(name = "境内收发货人代码",sort=12)
   private String consignCode;
 
   // 境内收发货人名称
+  @Excel(name = "境内收发货人名称",sort=13)
   private String consignName;
 
   /**
    * 境外收发货人代码
    */
+  @Excel(name = "境外收发货人代码",sort=14)
   private String frnConsignCode;
   /**
    * 境外收发货人名称(中文)
    */
+  @Excel(name = "境外收发货人名称(中文)",sort=15)
   private String frnConsignName;
 
   // 监管方式
-  @Excel(name = "监管方式")
+  @Excel(name = "监管方式",sort=16)
   private String tradeMode;
 
   // 贸易国别代码
-  @Excel(name = "贸易国别")
+  @Excel(name = "贸易国别",sort=17)
   private String tradeCountry;
 
   //货运量毛重
+  @Excel(name = "货运量毛重",sort=18)
   private BigDecimal grossWt;
 
   //货运量净重
+  @Excel(name = "货运量净重",sort=19)
   private BigDecimal netWt;
 
   /** 货运值人民币 */
+  @Excel(name = "货运值人民币(总)",sort=20)
   private BigDecimal rmbPrice;
 
   /** 货运值美元 */
+  @Excel(name = "货运值美元(总)",sort=21)
   private BigDecimal usdPrice;
 
   /** 集装箱数量 */
@@ -114,165 +121,210 @@ public class Entry implements Serializable {
 
   // 报关模式(部分订单既是两步申报又是提前申报,做多两种模式所以该字段采用逗号存储,方便组合查询):
   // 1:一般申报 2:两步申报3:提前申报
-  @Excel(name = "报关模式")
+  @Excel(name = "报关模式",dictType = "decl_mode",sort=22)
   private String declMode;
 
   // 报关单状态 1:未放行 2:已放行未结关3:已结关
   private String declStatus;
 
   // 现场接单时间:对应ENTRY_WORKFLOW表STEP_ID='30000000'节点(只要PROC_RESULT为G的)
-  private LocalDateTime orderReceiveDate;
+  @Excel(name = "现场接单时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=23)
+  private Date orderReceiveDate;
 
   /** 接单耗时即单证审核时长(秒) */
+  @Excel(name = "接单耗时(小时)",sort=24)
   private BigDecimal orderReceiveCost;
 
   // 单证放行时间:ENTRY_WORKFLOW '70000000'节点时间
-  private LocalDateTime certRlsDate;
+  @Excel(name = "单证放行时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=25)
+  private Date certRlsDate;
 
   // 担保放行时间:对应ENTRY_WORKFLOW表STEP_ID='81000000'节点
-  private LocalDateTime preReleaseDate;
+  @Excel(name = "担保放行时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=26)
+  private Date preReleaseDate;
 
   // 申报单位代码
+  @Excel(name = "申报单位代码",sort=27)
   private String agentCode;
 
   // 申报单位名称
+  @Excel(name = "接单耗时(小时)",sort=28)
   private String agentName;
 
-  // 备注
-  private String noteS;
 
   // 货主单位代码/h2018生产销售单位代码
+  @Excel(name = "生产销售单位代码",sort=29)
   private String ownerCode;
 
   // 货主单位名称/h2018生产销售单位名称
+  @Excel(name = "生产销售单位名称",sort=30)
   private String ownerName;
 
   // 转关数据发送时间
-  private LocalDateTime examDate;
+  @Excel(name = "转关数据发送时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=31)
+  private Date examDate;
 
   // 转关数据核销时间
-  private LocalDateTime checkDate;
+  @Excel(name = "转关数据核销时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=32)
+  private Date checkDate;
 
   // 完整申报电子申报时间
-  private LocalDateTime compEleDate;
+  @Excel(name = "完整申报电子申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=33)
+  private Date compEleDate;
 
   // 结关时间
-  private LocalDateTime releaseDate;
+  @Excel(name = "结关时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=34)
+  private Date releaseDate;
 
   /** 海关通关时间(秒) */
+  @Excel(name = "海关通关时间(小时)",sort=35)
   private BigDecimal cuCost;
 
   /** 总体通关时间(秒) */
-  @Excel(name = "整体通关时间(秒)")
+  @Excel(name = "整体通关时间(小时)",sort=36)
   private BigDecimal totalCost;
 
   /** 申报前准备时间(秒) */
-  @Excel(name = "申报前准备时间(秒)")
+  @Excel(name = "申报前准备时间(小时)",sort=37)
   private BigDecimal beforeDeclCost;
 
   // 报关单是否专业审单(环节代码33000000不为9999标记):1-是,其它-否
+  @Excel(name = "是否专业审单",dictType = "yes_no",sort=38)
   private String profVerifyFlag;
 
   // 报关单是否新两步申报标记:1-是,其它-否
+  @Excel(name = "是否新两步申报",dictType = "yes_no",sort=39)
   private String newTwoStepFlag;
 
   //20250731新增业务
   //电子申报时间:对应ENTRY_WORKFLOW表STEP_ID='00000000'节点
-  private LocalDateTime eleDeclDate;
+  @Excel(name = "电子申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=40)
+  private Date eleDeclDate;
 
   //排查处置/现场验估时间:对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为M的)
-  private LocalDateTime assessStartDate;
+  @Excel(name = "现场验估时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=41)
+  private Date assessStartDate;
 
   //验估处置完毕时间:对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为G的)
-  private LocalDateTime assessEndDate;
+  @Excel(name = "验估处置完毕时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=42)
+  private Date assessEndDate;
 
   /** 退单时间 */
-  private LocalDateTime refundDate;
+  @Excel(name = "退单时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=43)
+  private Date refundDate;
 
   /** 是否退过单标记 */
   private String refundFlag;
 
-  // 查验指令下达时间:来源CI_CHECK_MAN_WORK_HEAD(对接物流辅助系统进口理货时间和指令下达时间哪个晚哪个就是下发时间)
-  private LocalDateTime manCreateTime;
-
-  // 查验开始时间:来源CI_CHECK_MAN_WORK_HEAD
-  private LocalDateTime manChkTimeStart;
+  // 是否查验:1:是,0:否
+  @Excel(name = "是否查验",dictType = "yes_no",sort=44)
+  private String checkFlag;
 
   // 查验关区:4位
+  @Excel(name = "是否查验",dictType = "affiliation_customs_info",sort=45)
   private String checkCustomsCode;
 
-  // 是否查验:1:是,0:否
-  private String checkFlag;
+  // 查验指令下达时间:来源CI_CHECK_MAN_WORK_HEAD(对接物流辅助系统进口理货时间和指令下达时间哪个晚哪个就是下发时间)
+  @Excel(name = "查验指令下达时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=46)
+  private Date manCreateTime;
+
+  // 查验开始时间:来源CI_CHECK_MAN_WORK_HEAD
+  @Excel(name = "查验开始时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=47)
+  private Date manChkTimeStart;
+
 
   // 查验结束时间:来源CI_CHECK_MAN_WORK_HEAD
-  private LocalDateTime manChkTimeEnd;
+  @Excel(name = "查验结束时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=48)
+  private Date manChkTimeEnd;
 
   // 处理结果
+  @Excel(name = "查验处理结果",dictType = "proc_result",sort=49)
   private String manProcResult;
 
   // 处理意见
+  @Excel(name = "查验处理意见",dictType = "proc_idea",sort=50)
   private String manProcIdea;
 
+  // 备注
+  @Excel(name = "备注",sort=51)
+  private String noteS;
+
   // 商品序号
-  private BigDecimal gNo;
+  @Excel(name = "商品序号",sort=52)
+  private BigDecimal gno;
 
   //按综合处杨科要求在新组合查询功能新增根据商品名称模糊查询
+  @Excel(name = "商品编码",sort=53)
   private String codeTs;
 
   /**
    * 检验检疫编码
    */
+  @Excel(name = "检验检疫编码",sort=53)
   private String iqCode;
 
   //按综合处杨科要求在新组合查询功能新增根据商品名称模糊查询    wq
-  private String gName;
+  @Excel(name = "商品名称",sort=54)
+  private String gname;
 
-  private String gModel;
+  @Excel(name = "规格型号",sort=55)
+  private String gmodel;
 
   //第一(法定)数量
+  @Excel(name = "第一(法定)数量",sort=56)
   private BigDecimal qty1;
 
   // 货运值人民币
+  @Excel(name = "货运值人民币",sort=57)
   private BigDecimal rmbPriceList;
 
   // 货运值美元
+  @Excel(name = "货运值美元",sort=58)
   private BigDecimal usdPriceList;
 
   //六位商品编码  2024-10-16
   private String codeTsShort;
 
   //每项商品需要监管证件
+  @Excel(name = "每项商品需要监管证件",sort=59)
   private String gCertFlag;
 
   /**
    * UN编码
    */
+  @Excel(name = "UN编码",sort=60)
   private String ungid;
 
   /**
    * 非危险化学品
    */
+  @Excel(name = "非危险化学品",dictType = "yes_no",sort=61)
   private String ungFlag;
   /**
    * 危包规格
    */
+  @Excel(name = "危包规格",sort=62)
   private String ungModel;
   /**
    * 危包类别
    */
+  @Excel(name = "危包类别",sort=63)
   private String ungClassify;
 
   /**
    * 危险货物名称
    */
+  @Excel(name = "危险货物名称",sort=64)
   private String ungGName;
   /**
    * 货物属性代码
    */
+  @Excel(name = "货物属性代码",sort=64)
   private String productCharCode;
 
   /**
    * 危险品类型(1、危化品;2、危险货物;3、危化品兼危险货物)
    */
+  @Excel(name = "危险品类型",sort=65)
   private String goodsType;
 }

+ 3 - 3
wxjy-wxjy-service/src/main/resources/mapper/analyze/GoodsEntryMapper.xml

@@ -63,11 +63,11 @@
         <result column="CHECK_FLAG" jdbcType="VARCHAR" property="checkFlag"/>
         <result column="MAN_PROC_RESULT" jdbcType="VARCHAR" property="manProcResult"/>
         <result column="MAN_PROC_IDEA" jdbcType="VARCHAR" property="manProcIdea"/>
-        <result column="G_NO" jdbcType="NUMERIC" property="gNo"/>
+        <result column="G_NO" jdbcType="NUMERIC" property="gno"/>
         <result column="CODE_TS" jdbcType="VARCHAR" property="codeTs"/>
         <result column="IQ_CODE" jdbcType="VARCHAR" property="iqCode"/>
-        <result column="G_NAME" jdbcType="VARCHAR" property="gName"/>
-        <result column="G_MODEL" jdbcType="VARCHAR" property="gModel"/>
+        <result column="G_NAME" jdbcType="VARCHAR" property="gname"/>
+        <result column="G_MODEL" jdbcType="VARCHAR" property="gmodel"/>
         <result column="QTY_1" jdbcType="NUMERIC" property="qty1"/>
         <result column="RMB_PRICE" jdbcType="NUMERIC" property="rmbPriceList"/>
         <result column="USD_PRICE" jdbcType="NUMERIC" property="usdPriceList"/>

+ 1 - 1
wxjy-wxjy-service/src/main/resources/mapper/system/DictDataMapper.xml

@@ -48,7 +48,7 @@
     </select>
 
     <select id="selectDictLabel" resultType="String">
-        select dict_label from zhsj_dict_data
+        select dict_label from wxjy_dict_data
         where dict_type = #{dictType} and dict_value = #{dictValue}
     </select>
 

+ 10 - 2
wxjy-wxjy-web/src/App.vue

@@ -20,7 +20,15 @@
               <el-icon>
                 <ScaleToOriginal />
               </el-icon>
-              <span>事后通知</span>
+              <span>新申报商品提示</span>
+            </el-menu-item>
+          </router-link>
+          <router-link to="/analyze/chemicals-entry">
+            <el-menu-item index="chemicals-entry" class="menu-item">
+              <el-icon>
+                <ScaleToOriginal />
+              </el-icon>
+              <span>危化品组合查询</span>
             </el-menu-item>
           </router-link>
           <router-link to="/analyze/goods-entry">
@@ -28,7 +36,7 @@
               <el-icon>
                 <ScaleToOriginal />
               </el-icon>
-              <span>危化品组合查询</span>
+              <span>危险货物组合查询</span>
             </el-menu-item>
           </router-link>
         </el-sub-menu>

+ 29 - 0
wxjy-wxjy-web/src/apis/analyze/chemicalsEntry.ts

@@ -0,0 +1,29 @@
+import type { AxiosResponse } from 'axios'
+import type { PageInfo, Result } from '@cacp/ui'
+import request from '@/utils/request'
+import download from 'js-file-download'
+
+import type {EntryInfo, Entry, EntryQuery, EntryQuery1} from '@/types/analyze/goodsEntry'
+
+const contextPath = '/analyze/chemicalsEntry'
+//获取单据
+export async function getEntryHead(entryId: string): Promise<Result<EntryInfo>> {
+  const res: AxiosResponse<Result<EntryInfo>> = await request.get(`${contextPath}/get-entry?entryId=${entryId}`)
+  return res.data
+}
+
+// 查询危险品报关单头列表
+export async function getList(query: EntryQuery): Promise<Result<PageInfo<Entry>>> {
+  const res: AxiosResponse<Result<PageInfo<Entry>>> = await request.post(`${contextPath}/get-list`, query)
+  return res.data
+}
+
+//获取单据列表
+export async function exportList(query: EntryQuery1): Promise<void> {
+  const res: AxiosResponse<Result<any>> = await request.post(`${contextPath}/goods-export`, query, {
+    responseType: 'arraybuffer'
+  })
+  if (res.status === 200) {
+    download(res.request.response, "危化品组合查询数据.xlsx", 'application/octet-stream')
+  }
+}

+ 1 - 1
wxjy-wxjy-web/src/apis/analyze/goodsEntry.ts

@@ -24,6 +24,6 @@ export async function exportList(query: EntryQuery1): Promise<void> {
     responseType: 'arraybuffer'
   })
   if (res.status === 200) {
-    download(res.request.response, "业务查询.xlsx", 'application/octet-stream')
+    download(res.request.response, "危险货物组合查询数据.xlsx", 'application/octet-stream')
   }
 }

+ 11 - 11
wxjy-wxjy-web/src/components/DynamicColumnSelector/DynamicColumnDialog.vue

@@ -356,7 +356,7 @@ if (typeof window !== 'undefined') {
   display: flex;
   flex-direction: column;
   //height: 100%;
-  max-height: 60vh;
+  max-height: 70vh;
   overflow-y: auto;
   padding-right: 10px;
   .column-search {
@@ -370,9 +370,9 @@ if (typeof window !== 'undefined') {
   .column-operations {
     display: flex;
     flex-wrap: wrap;
-    gap: 12px;
-    margin-bottom: 16px;
-    padding-bottom: 12px;
+    gap: 10px;
+    margin-bottom: 12px;
+    padding-bottom: 10px;
     border-bottom: 1px solid var(--el-border-color-light);
 
     .el-button {
@@ -393,15 +393,15 @@ if (typeof window !== 'undefined') {
     padding-right: 4px;
 
     .column-group {
-      margin-bottom: 20px;
+      margin-bottom: 12px;
 
       &:last-child {
         margin-bottom: 0;
       }
 
       .group-header {
-        margin-bottom: 12px;
-        padding: 8px 0;
+        margin-bottom: 10px;
+        padding: 6px 0;
         background-color: var(--el-fill-color-light);
         border-radius: 6px;
 
@@ -432,7 +432,7 @@ if (typeof window !== 'undefined') {
       .group-items {
         display: grid;
         grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
-        gap: 12px;
+        gap: 10px;
         padding: 0 4px;
 
         .el-checkbox {
@@ -485,8 +485,8 @@ if (typeof window !== 'undefined') {
   }
 
   .column-statistics {
-    margin-top: 16px;
-    padding-top: 12px;
+    margin-top: 12px;
+    padding-top: 10px;
     border-top: 1px solid var(--el-border-color-light);
     font-size: 14px;
     color: var(--el-text-color-secondary);
@@ -497,6 +497,6 @@ if (typeof window !== 'undefined') {
 .dialog-footer {
   display: flex;
   justify-content: flex-end;
-  gap: 12px;
+  gap: 10px;
 }
 </style>

+ 20 - 1
wxjy-wxjy-web/src/router/app-router.ts

@@ -53,12 +53,31 @@ const routers: Array<RouteRecordRaw> = [
       permissions:"NEW_DECLARED_GOODS_VIEW_BT"
     }
   },
+  {
+    path: '/analyze/chemicals-entry',
+    name: 'chemicalsEntry',
+    component: () => import('@/views/analyze/ChemicalsEntry.vue'),
+    meta: {
+      title: '表头',
+      permissions:"CHEMICALS_ENTRY_VIEW_BT"
+    }
+  },
+  {
+    path: '/get-chemicals',
+    component: () => import('@/views/analyze/ChemicalsEntryDetail.vue'),
+    meta: {
+      title: '报关单详情',
+      keepAlive: false,
+      permissions:"CHEMICALS_ENTRY_VIEW_BT"
+    }
+  },
   {
     path: '/analyze/goods-entry',
     name: 'goodsEntry',
     component: () => import('@/views/analyze/GoodsEntry.vue'),
     meta: {
       title: '表头',
+      permissions:"GOODS_ENTRY_VIEW_BT"
     }
   },
   {
@@ -67,7 +86,7 @@ const routers: Array<RouteRecordRaw> = [
     meta: {
       title: '报关单详情',
       keepAlive: false,
-      permissions:"CHECK_VIEW_BT"
+      permissions:"GOODS_ENTRY_VIEW_BT"
     }
   },
   {

+ 1104 - 0
wxjy-wxjy-web/src/views/analyze/ChemicalsEntry.vue

@@ -0,0 +1,1104 @@
+<template>
+  <cacp-search-layout>
+    <template #search>
+      <cacp-search-panel-layout
+          :model="state.queryData"
+          ref="formRef"
+          :rules="rules"
+          label-position="left"
+          label-width="auto"
+          :gutter="30"
+          :colSpan="6"
+      >
+        <el-form-item label="报关单号" prop="entryId">
+          <el-input v-model="state.queryData.entryId" clearable />
+        </el-form-item>
+        <el-form-item label="通关模式" prop="passMode">
+          <el-select v-model="state.queryData.passMode" clearable>
+            <el-option
+                v-for="item in dict.pass_mode"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="运输方式" prop="trafMode">
+          <el-select v-model="state.queryData.trafMode" filterable clearable>
+            <el-option
+                v-for="item in trafMode"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              <span style="float: left">{{ item.label }}</span>
+              <span style="float: right;color: var(--el-text-color-secondary);font-size: 13px;">
+                {{ item.value }}
+                  </span>
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="进出口标识" prop="ieFlag">
+          <el-select v-model="state.queryData.ieFlag" clearable>
+            <el-option
+                v-for="item in dict.ie_flag"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="进出境口岸" prop="iePort">
+          <el-select v-model="state.queryData.iePort" filterable
+                     clearable>
+            <el-option
+                v-for="item in iePort"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            >
+              <span style="float: left">{{ item.label }}</span>
+              <span style="float: right;color: var(--el-text-color-secondary);font-size: 13px;">
+                {{ item.value }}
+                  </span>
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="隶属海关" prop="customsCode" v-show="state.isSelect">
+          <el-select v-model="state.queryData.customsCode"
+                     clearable>
+            <el-option
+                v-for="item in dict.affiliation_customs_info"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="监管方式" prop="tradeMode">
+          <el-select v-model="state.queryData.tradeMode" clearable>
+            <el-option
+                v-for="item in tradeMode"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              <span style="float: left">{{ item.label }}</span>
+              <span style="float: right;color: var(--el-text-color-secondary);font-size: 13px;">
+                {{ item.value }}
+                  </span>
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="报关模式" prop="declMode">
+          <el-select v-model="state.queryData.declMode"
+                     clearable>
+            <el-option
+                v-for="item in dict.decl_mode"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="是否查验" prop="checkFlag">
+          <el-select v-model="state.queryData.checkFlag"
+                     clearable>
+            <el-option
+                v-for="item in dict.yes_no"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="结关开始时间" prop="beginReleaseDate">
+          <el-date-picker type="date" value-format="YYYY-MM-DD" v-model="state.queryData.beginReleaseDate"
+                          :disabled-date="beginDatePickerOptions" clearable />
+        </el-form-item>
+        <el-form-item label="结关结束时间" prop="endReleaseDate">
+          <el-date-picker type="date" value-format="YYYY-MM-DD" v-model="state.queryData.endReleaseDate"
+                          :disabled-date="endDatePickerOptions" clearable />
+        </el-form-item>
+        <template #buttonGroup>
+          <el-button type="primary" @click="onSearch">查询</el-button>
+          <el-button type="info" @click="onReset">重置</el-button>
+        </template>
+      </cacp-search-panel-layout>
+    </template>
+    <cacp-complex-table
+        :actions="actions"
+        :data="tableData"
+        :pagination="tablePagination"
+        :actionsWidth="50"
+        @on-page-change="onPageChange"
+        @on-size-change="onSizeChange"
+        :loading="loading"
+    >
+      <!-- 动态渲染所有列 -->
+      <template v-for="column in dynamicColumns.visibleColumns.value" :key="column.key">
+        <el-table-column v-bind="getColumnProps(column)">
+          <template #default="scope">
+            <template v-if="column.isDict">
+              <dict-tag
+                :options="getDictOptions(column.dictKey!)"
+                :dictValue="scope.row[column.property!]"
+                :whole-match="column.key === 'goodsType'"
+              />
+            </template>
+            <template v-else-if="column.isDate">
+              {{ scope.row[column.property!] ? dayjs(scope.row[column.property!]).format('YYYY-MM-DD HH:mm:ss'):'' }}
+            </template>
+            <template v-else-if="getFormatter(column.key)">
+              {{ getFormatter(column.key)!(scope.row[column.property!]) }}
+            </template>
+            <template v-else>
+              {{ scope.row[column.property!] }}
+            </template>
+          </template>
+        </el-table-column>
+      </template>
+    </cacp-complex-table>
+
+    <!-- 动态列设置对话框 -->
+    <DynamicColumnDialog
+      v-model="showColumnDialog"
+      :width="'70%'"
+      :columns="allColumnConfigs"
+      :selected-keys="dynamicColumns.selectedKeys.value"
+      @update:selected-keys="dynamicColumns.updateSelectedKeys"
+    />
+  </cacp-search-layout>
+</template>
+<script setup lang="ts">
+import { useLoading } from '@cacp/ui'
+import { exportList, getList} from '@/apis/analyze/chemicalsEntry'
+import type {EntryQuery, Entry} from '@/types/analyze/goodsEntry'
+import config from '@/config'
+import { getBaseCodeList } from '@/apis/base/baseCode'
+
+import dayjs from 'dayjs'
+
+import {
+  SuccessResultCode,
+  useComplexTable,
+  type SearchPanelLayoutInstance,
+  type TableAction
+} from '@cacp/ui'
+import type { FormRules } from 'element-plus'
+import { ref, reactive, onBeforeMount } from 'vue'
+import { useRouter } from 'vue-router'
+import { permissionStatus } from '@/utils/globalPermission'
+import { useDictType } from '@/components/useDict'
+import { useCoreStore } from '@/stores'
+import DictTag from "@/components/DictTag/dictTag.vue";
+import DynamicColumnDialog, { type ColumnConfig } from '@/components/DynamicColumnSelector/DynamicColumnDialog.vue'
+import { useDynamicColumns } from '@/hooks/useDynamicColumns'
+const coreStore = useCoreStore()
+
+interface State {
+  queryData: EntryQuery
+  isSelect: boolean
+}
+const { loading, setLoading } = useLoading()
+const { dict } = useDictType('affiliation_customs_info', 'proc_idea', 'proc_result', 'yes_no', 'decl_mode', 'pass_mode', 'ie_flag','goods_type')
+const tableHooks = useComplexTable<Entry>(config)
+const { tableData, tablePagination, setPagination, setPageIndex, setPageSizes } = tableHooks
+const router = useRouter()
+
+const formRef = ref<SearchPanelLayoutInstance>()
+//基础数据返回jsonObject
+const iePort = ref([]);
+const trafMode = ref([]);
+const tradeMode = ref([]);
+const tradeCountry = ref([]);
+const countryIso = ref([]);
+
+const now = dayjs();
+
+const endDatePickerOptions = (time:Date) => {
+  if (!state.queryData.beginReleaseDate) return false // 如果没有选择开始日期,结束日期不受限制
+  return time.getTime() < new Date(state.queryData.beginReleaseDate).getTime() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
+
+const beginDatePickerOptions = (time:Date) => {
+  if (!state.queryData.endReleaseDate) return false // 如果没有选择开始日期,结束日期不受限制
+  return time.getTime() > new Date(state.queryData.endReleaseDate).getTime() - 8.64e6;//如果没有后面的-8.64e6就是不可以选择今天的
+}
+// 定义所有列的配置
+const allColumnConfigs: ColumnConfig[] = [
+  {
+    key: 'entryId',
+    property: 'entryId',
+    label: '报关单号',
+    width: 160,
+    sortable: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'passMode',
+    property: 'passMode',
+    label: '通关模式',
+    width: 80,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDict: true,
+    dictKey: 'pass_mode'
+  },
+  {
+    key: 'trafMode',
+    property: 'trafMode',
+    label: '运输方式',
+    width: 80,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'ieFlag',
+    property: 'ieFlag',
+    label: '出入境标志',
+    width: 90,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDict: true,
+    dictKey: 'ie_flag'
+  },
+  {
+    key: 'iePort',
+    property: 'iePort',
+    label: '进出境口岸',
+    width: 100,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'customsCode',
+    property: 'customsCode',
+    label: '隶属海关',
+    width: 100,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDict: true,
+    dictKey: 'affiliation_customs_info'
+  },
+  {
+    key: 'tradeMode',
+    property: 'tradeMode',
+    label: '监管方式',
+    width: 80,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'declMode',
+    property: 'declMode',
+    label: '报关模式',
+    width: 80,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDict: true,
+    dictKey: 'decl_mode'
+  },
+  {
+    key: 'tradeCountry',
+    property: 'tradeCountry',
+    label: '贸易国别',
+    width: 80,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'ieDate',
+    property: 'ieDate',
+    label: '进出口时间',
+    width: 150,
+    sortable: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDate: true
+  },
+  {
+    key: 'declDate',
+    property: 'declDate',
+    label: '申报时间',
+    width: 150,
+    sortable: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDate: true
+  },
+  {
+    key: 'releaseDate',
+    property: 'releaseDate',
+    label: '结关时间',
+    width: 150,
+    sortable: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true,
+    isDate: true
+  },
+  {
+    key: 'declAdvanceFlag',
+    property: 'declAdvanceFlag',
+    label: '是否提前申报',
+    width: 110,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+  {
+    key: 'acceptDate',
+    property: 'acceptDate',
+    label: '自动受理时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'exInPortDate',
+    property: 'exInPortDate',
+    label: '货物进港时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'orderReceiveDate',
+    property: 'orderReceiveDate',
+    label: '现场接单时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'certRlsDate',
+    property: 'certRlsDate',
+    label: '单证放行时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'preReleaseDate',
+    property: 'preReleaseDate',
+    label: '担保放行时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'examDate',
+    property: 'examDate',
+    label: '转关数据发送时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'checkDate',
+    property: 'checkDate',
+    label: '转关数据核销时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'assessStartDate',
+    property: 'assessStartDate',
+    label: '现场验估时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'assessEndDate',
+    property: 'assessEndDate',
+    label: '验估处置完毕时间',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'newTwoStepFlag',
+    property: 'newTwoStepFlag',
+    label: '是否新两步申报',
+    width: 120,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+
+  // 单位信息组
+  {
+    key: 'consignCode',
+    property: 'consignCode',
+    label: '境内收发货人代码',
+    width: 130,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'consignName',
+    property: 'consignName',
+    label: '境内收发货人名称',
+    width: 130,
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'frnConsignCode',
+    property: 'frnConsignCode',
+    label: '境外收发货人代码',
+    width: 130,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'frnConsignName',
+    property: 'frnConsignName',
+    label: '境外收发货人名称(中文)',
+    width: 170,
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'agentCode',
+    property: 'agentCode',
+    label: '申报单位代码',
+    width: 110,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'agentName',
+    property: 'agentName',
+    label: '申报单位名称',
+    width: 110,
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ownerCode',
+    property: 'ownerCode',
+    label: '生产销售单位代码',
+    width: 130,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ownerName',
+    property: 'ownerName',
+    label: '生产销售单位名称',
+    width: 130,
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+
+  // 货运信息组
+  {
+    key: 'grossWt',
+    property: 'grossWt',
+    label: '货运量毛重',
+    width: 90,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'netWt',
+    property: 'netWt',
+    label: '货运量净重',
+    width: 90,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'rmbPrice',
+    property: 'rmbPrice',
+    label: '货运值人民币(总)',
+    width: 130,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'usdPrice',
+    property: 'usdPrice',
+    label: '货运值美元(总)',
+    width: 130,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+
+  // 时效信息组
+  {
+    key: 'orderReceiveCost',
+    property: 'orderReceiveCost',
+    label: '接单耗时(小时)',
+    width: 120,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'cuCost',
+    property: 'cuCost',
+    label: '海关通关时间(小时)',
+    width: 140,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'totalCost',
+    property: 'totalCost',
+    label: '整体通关时间(小时)',
+    width: 140,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: true
+  },
+  {
+    key: 'beforeDeclCost',
+    property: 'beforeDeclCost',
+    label: '申报前准备时间(小时)',
+    width: 150,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'noteS',
+    property: 'noteS',
+    label: '备注',
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+
+  // 查验信息组
+  {
+    key: 'checkFlag',
+    property: 'checkFlag',
+    label: '是否查验',
+    width: 80,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+  {
+    key: 'checkCustomsCode',
+    property: 'checkCustomsCode',
+    label: '查验海关',
+    width: 100,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'affiliation_customs_info'
+  },
+  {
+    key: 'manCreateTime',
+    property: 'manCreateTime',
+    label: '查验指令下达时间',
+    width: 150,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'manChkTimeStart',
+    property: 'manChkTimeStart',
+    label: '查验开始时间',
+    width: 150,
+    sortable: true,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'manChkTimeEnd',
+    property: 'manChkTimeEnd',
+    label: '查验结束时间',
+    width: 150,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'manProcResult',
+    property: 'manProcResult',
+    label: '处理结果',
+    width: 80,
+    showOverflowTooltip: true,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'proc_result'
+  },
+  {
+    key: 'manProcIdea',
+    property: 'manProcIdea',
+    label: '处理意见',
+    width: 80,
+    showOverflowTooltip: true,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'proc_idea'
+  },
+  {
+    key: 'profVerifyFlag',
+    property: 'profVerifyFlag',
+    label: '是否专业审单',
+    width: 110,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+
+  // 商品信息组
+  {
+    key: 'gno',
+    property: 'gno',
+    label: '商品项号',
+    width: 80,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: true
+  },
+  {
+    key: 'iqCode',
+    property: 'iqCode',
+    label: '检验检疫编码',
+    width: 120,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'codeTs',
+    property: 'codeTs',
+    label: '商品编码',
+    width: 100,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: true
+  },
+  {
+    key: 'gname',
+    property: 'gname',
+    label: '商品名称',
+    width: 100,
+    showOverflowTooltip: true,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: true
+  },
+  {
+    key: 'gmodel',
+    property: 'gmodel',
+    label: '规格型号',
+    width: 100,
+    showOverflowTooltip: true,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: true
+  },
+  {
+    key: 'qty1',
+    property: 'qty1',
+    label: '第一(法定)数量',
+    width: 120,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'rmbPriceList',
+    property: 'rmbPriceList',
+    label: '商品货运值人民币',
+    width: 130,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'usdPriceList',
+    property: 'usdPriceList',
+    label: '商品货运值美元',
+    width: 130,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'gCertFlag',
+    property: 'gCertFlag',
+    label: '每项商品需要监管证件',
+    width: 160,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ungid',
+    property: 'ungid',
+    label: 'UN编码',
+    width: 70,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ungFlag',
+    property: 'ungFlag',
+    label: '非危险化学品',
+    width: 110,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+  {
+    key: 'ungModel',
+    property: 'ungModel',
+    label: '危包规格',
+    width: 110,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ungClassify',
+    property: 'ungClassify',
+    label: '危包类别',
+    width: 80,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'ungGName',
+    property: 'ungGName',
+    label: '危险货物名称',
+    width: 110,
+    showOverflowTooltip: true,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'productCharCode',
+    property: 'productCharCode',
+    label: '货物属性代码',
+    width: 110,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
+  {
+    key: 'goodsType',
+    property: 'goodsType',
+    label: '危险品类型',
+    width: 130,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: true,
+    isDict: true,
+    dictKey: 'goods_type'
+  }
+];
+
+// 使用动态列 Hook
+const dynamicColumns = useDynamicColumns({
+  storageKey: 'chemicals_entry_columns',
+  defaultVisibleKeys: allColumnConfigs
+    .filter(col => col.defaultVisible)
+    .map(col => col.key),
+  columns: allColumnConfigs
+})
+
+// 对话框显示状态
+const showColumnDialog = ref(false)
+
+
+
+
+const state = reactive<State>({
+  queryData: {
+    entryId: '',
+    beginReleaseDate: now.subtract(1, 'month').format('YYYY-MM-DD'),
+    endReleaseDate: now.format('YYYY-MM-DD'),
+    ieFlag: '',
+    iePort: '',
+    customsCode: '',
+    passMode: '',
+    trafMode: '',
+    tradeMode: '',
+    declMode: '',
+    checkFlag: '',
+    goodsType: '1'
+  },
+  isSelect: false,
+})
+const rules = reactive<FormRules<EntryQuery>>({
+  beginReleaseDate: [{ required: true, message: '请输入结关开始时间', trigger: 'change' }],
+  endReleaseDate: [{ required: true, message: '请输入结关结束时间', trigger: 'change' }]
+})
+
+const actions = <Array<TableAction>>[
+  {
+    key: '1',
+    text: '查看',
+    onclick: onView,
+    limit: permissionStatus('one', 'CHEMICALS_ENTRY_VIEW_BT'),
+    type: 'primary'
+  },
+  {
+    key: '2',
+    text: '动态列设置',
+    onclick: onColumnsSelector,
+    limit: 'none',
+    type: 'primary'
+  },
+  {
+    key: '3',
+    text: '导出',
+    confirm: true,
+    onclick: onExportData,
+    limit: permissionStatus('none', 'CHEMICALS_ENTRY_EXPORT_BT'),
+    type: 'primary'
+  },
+]
+
+const getColumnProps = (column: any) => {
+  // 类型断言为 ColumnConfig
+  const col = column as ColumnConfig
+
+  const props: Record<string, any> = {
+    property: col.property || col.key,
+    label: col.label
+  }
+
+  if (col.width) props.width = col.width
+  if (col.sortable) props.sortable = col.sortable
+  if (col.showOverflowTooltip) props['show-overflow-tooltip'] = col.showOverflowTooltip
+
+  return props
+}
+
+
+function onSearch() {
+  onPageChange(1)
+}
+
+function onReset() {
+  formRef.value.resetFields()
+  onPageChange(1)
+}
+
+
+function onColumnsSelector() {
+  showColumnDialog.value = true;
+}
+
+function onView(row: Entry) {
+  router.push({
+    path: '/get-chemicals',
+    query: {
+      entryId: row.entryId
+    }
+  })
+}
+
+function onPageChange(page: number) {
+  setPageIndex(page)
+  onLoadData()
+}
+function onSizeChange(size: number) {
+  setPageSizes(size)
+  onLoadData()
+}
+
+// 运输方式
+function formatTrafMode(code: string): string {
+  const result = trafMode.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 监管方式
+function formatTradeMode(code: string): string {
+  const result = tradeMode.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 监管方式
+function formatCountryIso(code: string): string {
+  const result = countryIso.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 进出境口岸
+function formatIePort(code: string): string {
+  const result = iePort.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 获取字典选项
+const getDictOptions = (dictKey: string) => {
+  return dict.value?.[dictKey] || []
+}
+
+// 根据列键获取格式化函数
+const getFormatter = (key: string): ((value: any) => string) | undefined => {
+  const formatters: Record<string, (value: any) => string> = {
+    'trafMode': formatTrafMode,
+    'tradeMode': formatTradeMode,
+    'tradeCountry': formatCountryIso,
+    'iePort': formatIePort
+  }
+
+  return formatters[key]
+}
+
+// 加载数据
+async function onLoadData() {
+  const loginCustomsCode = coreStore.currentUser.customsCode;
+  if("4700" === loginCustomsCode){
+    state.isSelect = true;
+  }else{
+    state.queryData.customsCode = loginCustomsCode;
+    state.isSelect = false;
+  }
+  const query = { ...state.queryData, pageIndex: tablePagination.currentPage, pageSize: tablePagination.pageSize }
+  setLoading(true)
+  const res = await getList(query)
+  if (res.code == SuccessResultCode) {
+    setPagination(res.data)
+  }
+  setLoading(false)
+}
+
+// 加载数据
+async function onExportData() : Promise<void>{
+  const query = { ...state.queryData,exportHeadList:dynamicColumns.selectedKeys.value.toString()}
+  await exportList(query);
+}
+
+async function getTrafMode() {
+  const traf = await getBaseCodeList("TransitMode")
+  if (traf.code == SuccessResultCode) {
+    trafMode.value = traf.data
+  }
+}
+
+async function getCustoms() {
+  const traf = await getBaseCodeList("customsCode")
+  if (traf.code == SuccessResultCode) {
+    iePort.value = traf.data
+  }
+}
+
+async function getTradeMode() {
+  const traf = await getBaseCodeList("tradeCode")
+  if (traf.code == SuccessResultCode) {
+    tradeMode.value = traf.data
+  }
+}
+
+async function getTradeCountry() {
+  const traf = await getBaseCodeList("countryCode")
+  if (traf.code == SuccessResultCode) {
+    tradeCountry.value = traf.data
+  }
+}
+
+async function getCountryIso() {
+  const traf = await getBaseCodeList("countryIsoE")
+  if (traf.code == SuccessResultCode) {
+    countryIso.value = traf.data
+  }
+}
+
+onBeforeMount(async () => {
+  await Promise.all([ getCustoms(),getTrafMode(),getTradeMode(),getTradeCountry(),getCountryIso()])
+  setTimeout(() => {
+    onLoadData()
+  }, 500)
+//  console.log(dict);
+})
+</script>

+ 435 - 0
wxjy-wxjy-web/src/views/analyze/ChemicalsEntryDetail.vue

@@ -0,0 +1,435 @@
+<template>
+  <el-scrollbar class="typical-three" v-loading="loading">
+    <el-row justify="space-between">
+      <el-col :span="10">
+          <span class="back-btn" @click="onGoBack"
+          ><el-icon :size="20" class="back"><Back /></el-icon></span>
+      </el-col>
+    </el-row>
+    <cacp-group-container title="基础信息">
+      <template #content>
+        <div class="cacp-complex__table" @mouseover="changeHoverEle" @mouseleave="visible = false">
+          <el-row>
+            <el-col class="cacp-complex__label--title" :span="2">报关单号</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.entryId }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">通关模式</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.pass_mode" :dictValue="info.passMode"/>
+            </el-col>
+            <el-col class="cacp-complex__label--title" :span="2">运输方式</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ formatTrafMode(info.trafMode) }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">进出口标记</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.ie_flag" :dictValue="info.ieFlag"/></el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">出入境口岸</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ formatIePort(info.iePort) }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">主管海关</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">
+              <dict-tag :options="dict.affiliation_customs_info" :dictValue="info.customsCode"/>
+            </el-col>
+            <el-col class="cacp-complex__label--title" :span="2">监管方式</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ formatTradeMode(info.tradeMode) }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">报关模式</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.decl_mode" :dictValue="info.declMode"/></el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">贸易国别</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ formatCountryIso(info.tradeCountry) }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">申报日期</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.declDate ? dayjs(info.declDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">进口日期</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.ieDate ? dayjs(info.ieDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">是否提前申报</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.yes_no" :dictValue="info.declAdvanceFlag"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">自动受理时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.acceptDate ? dayjs(info.acceptDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">货物进港时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.exInPortDate ? dayjs(info.exInPortDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+
+            <el-col class="cacp-complex__label--yellow" :span="2">申报单位</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="10">{{ info.agentName}}/{{ info.agentCode }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">境内收发货人</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="10">{{ info.consignName }}/{{ info.consignCode}}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">消费使用单位</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="10">{{ info.ownerName }}/{{info.ownerCode }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">境外收发货人</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="10">{{ info.frnConsignName }}/{{ info.frnConsignCode }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">现场接单时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.orderReceiveDate?dayjs(info.orderReceiveDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">接单耗时(小时)</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ info.orderReceiveCost}}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">单证放行时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.certRlsDate?dayjs(info.certRlsDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">担保放行时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.preReleaseDate?dayjs(info.preReleaseDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">转关数据发送时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.examDate?dayjs(info.examDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">转关数据核销时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.checkDate?dayjs(info.checkDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">结关时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.releaseDate?dayjs(info.releaseDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">海关通关时间(小时)</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ info.cuCost}}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">整体通关时间(小时)</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ info.totalCost}}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">申报前准备时间(小时)</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="4">{{ info.beforeDeclCost}}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">是否专业审单</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.yes_no" :dictValue="info.profVerifyFlag"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">是否新两步申报</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.yes_no" :dictValue="info.newTwoStepFlag"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">现场验估时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.assessStartDate?dayjs(info.assessStartDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">验估处置完毕时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.assessEndDate?dayjs(info.assessEndDate).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">是否查验</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.yes_no" :dictValue="info.checkFlag"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">查验海关</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.affiliation_customs_info" :dictValue="info.checkCustomsCode"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">查验指令下达时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.manCreateTime?dayjs(info.manCreateTime).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">查验开始时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.manChkTimeStart?dayjs(info.manChkTimeStart).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">查验结束时间</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.manChkTimeEnd?dayjs(info.manChkTimeEnd).format('YYYY-MM-DD HH:mm:ss'):'' }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">处理结果</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.proc_result" :dictValue="info.manProcResult"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">处理意见</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">
+              <dict-tag :options="dict.proc_idea" :dictValue="info.manProcIdea"/></el-col>
+            <el-col class="cacp-complex__label--title" :span="2">毛重</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.grossWt }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">净重</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.netWt }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">货运值人民币(总)</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="4">{{ info.rmbPrice }}</el-col>
+            <el-col class="cacp-complex__label--title" :span="2">货运值美元(总)</el-col>
+            <el-col class="cacp-complex__value--grey01" :span="10">{{ info.usdPrice }}</el-col>
+            <el-col class="cacp-complex__label--yellow" :span="2">备注</el-col>
+            <el-col class="cacp-complex__value--yellow01" :span="22">{{ info.noteS }}</el-col>
+          </el-row>
+        </div>
+      </template>
+    </cacp-group-container>
+
+    <cacp-group-container title="商品信息">
+      <template #content>
+        <el-table
+            ref="multipleTableRef"
+            :scrollbar-always-on="true"
+            :data="tableData"
+            style="width: 100%"
+            header-cell-class-name="cn-cacp-head"
+            @row-click="rowClick"
+        >
+          <template v-for="(item, index) in column" :key="index">
+            <el-table-column v-if="item.type == 'index'" :label="item.label" :show-overflow-tooltip="item.showOverflow" type="index" width="54" align="center" />
+            <el-table-column
+                v-else
+                :prop="item.prop"
+                :label="item.label"
+                :width="item.width"
+                :min-width="item.minWidth"
+                :show-overflow-tooltip="item.showOverflow"
+            />
+          </template>
+        </el-table>
+        <div class="cacp-mv-l">
+          <el-pagination
+              v-model:current-page="currentPage"
+              v-model:page-size="pageSize"
+              :page-sizes="[100, 200, 300, 400]"
+              :background="true"
+              layout="total, sizes,->, prev, pager, next"
+              :total="100"
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+          />
+        </div>
+        <div
+            class="cacp-complex__table"
+            @mouseover="changeHoverEle"
+            @mouseleave="visible = false"
+            v-loading="detailLoading"
+        >
+          <el-row>
+            <el-col class="cacp-complex__nesting--col" :span="24">
+              <el-row class="cacp-complex__nesting--row">
+                <el-col class="cacp-complex__label--title" :span="2">商品项号</el-col>
+                <el-col :span="2">{{ rowData.gno }}</el-col>
+                <!-- 第二行 -->
+                <el-col class="cacp-complex__label--title" :span="2">商品编码</el-col>
+                <el-col :span="2">{{ rowData.codeTs }}</el-col>
+                <el-col class="cacp-complex__label--title" :span="2">检验检疫编码</el-col>
+                <el-col :span="2">{{ rowData.iqCode }}</el-col>
+                <el-col class="cacp-complex__label--title" :span="2">商品名称</el-col>
+                <el-col :span="10">{{ rowData.gname }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">规格型号</el-col>
+                <el-col :span="10">{{ rowData.gmodel }}</el-col>
+                <!-- 第五行 -->
+                <el-col class="cacp-complex__label--title" :span="2">法定第一数量</el-col>
+                <el-col :span="2">{{ rowData.qty1 }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">货运值人民币</el-col>
+                <el-col :span="2">{{ rowData.rmbPrice }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">货运值美元</el-col>
+                <el-col :span="2">{{ rowData.usdPrice }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">每项商品需要监管证件</el-col>
+                <el-col :span="2">{{ rowData.gCertFlag }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">非危险化学品</el-col>
+                <el-col :span="2"><dict-tag :options="dict.yes_no" :dictValue="rowData.ungFlag"/></el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">危包规格</el-col>
+                <el-col :span="6">{{ rowData.ungModel }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">危险货物名称</el-col>
+                <el-col :span="6">{{ rowData.ungGName }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">危包类别</el-col>
+                <el-col :span="2">{{ rowData.ungClassify }}</el-col>
+                <el-col class="cacp-complex__label&#45;&#45;title" :span="2">危险品类型</el-col>
+                <el-col :span="2"><dict-tag :options="dict.goods_type" :whole-match="true" :dictValue="rowData.goodsType"/></el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
+      </template>
+    </cacp-group-container>
+    <el-tooltip
+        effect="light"
+        ref="tooltipRef"
+        :visible="visible"
+        :popper-options="{
+        modifiers: [
+          {
+            name: 'offset',
+            options: {
+              offset: [0, 7] // 水平偏移0,垂直偏移10像素
+            }
+          }
+        ]
+      }"
+        :virtual-ref="buttonRef"
+        virtual-triggering
+        popper-class="tip-tooltip"
+        :content="tipText"
+    >
+    </el-tooltip>
+  </el-scrollbar>
+</template>
+<script lang="ts" setup>
+import { getEntryHead} from '@/apis/analyze/goodsEntry'
+import type {Head,List} from '@/types/analyze/goodsEntry'
+import { SuccessResultCode } from '@cacp/ui'
+import { ElTable } from 'element-plus'
+import { onMounted, ref, watch } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import dayjs from 'dayjs'
+import { getBaseCodeList } from '@/apis/base/baseCode'
+import {useDictType} from "@/components/useDict";
+import DictTag from "@/components/DictTag/dictTag.vue";
+const currentPage = ref<number>(1)
+const pageSize = ref<number>(100)
+const buttonRef = ref<HTMLElement>()
+const visible = ref<boolean>(false)
+const tipText = ref<string>('')
+const router = useRouter()
+const route = useRoute()
+const { dict } = useDictType('affiliation_customs_info', 'proc_idea', 'proc_result', 'yes_no', 'decl_mode', 'pass_mode', 'ie_flag','goods_type')
+
+
+const info = ref<Head>({} as Head)
+const multipleTableRef = ref<InstanceType<typeof ElTable>>()
+const tableData = ref<List[]>([])
+const rowData = ref<List>({} as List)
+const column = [
+  { type: 'index', label: '序号', width: '36px', fixed: 'left' },
+  {
+    label: '商品编号',
+    prop: 'codeTs',
+    width: '100px'
+  },
+  {
+    label: '检验检疫编码',
+    prop: 'iqCode',
+    width: '120px'
+  },
+  {
+    label: '商品名称',
+    prop: 'gname',
+    minWidth: '230px',
+    showOverflow:true
+  },
+  {
+    label: '规格型号',
+    prop: 'gmodel',
+    width: '260px',
+    showOverflow:true
+  },
+  {
+    label: '第一(法定)数量',
+    prop: 'qty1',
+    width: '120px'
+  },
+  {
+    label: '统计人民币价',
+    prop: 'rmbPrice',
+    width: '120px'
+  },
+  {
+    label: '统计美元价',
+    prop: 'usdPrice',
+    width: '120px'
+  }
+]
+const loading = ref(false)
+const detailLoading = ref(false)
+const rowClick = async (row: List) => {
+  rowData.value = row
+}
+const handleSizeChange = (size: number) => {
+  console.log(size)
+}
+const handleCurrentChange = (page: number) => {
+  console.log(page)
+}
+
+const changeHoverEle = (e: MouseEvent) => {
+  if (e.target instanceof HTMLElement) {
+    if (e.target && e.target.innerText && e.target.scrollWidth > e.target.offsetWidth) {
+      buttonRef.value = e.target
+      visible.value = true
+      tipText.value = e.target.innerText
+    } else {
+      visible.value = false
+    }
+  }
+}
+//基础数据返回jsonObject
+const iePort = ref([]);
+const trafMode = ref([]);
+const tradeMode = ref([]);
+const tradeCountry = ref([]);
+const countryIso = ref([]);
+const unit = ref([]);
+// 运输方式
+function formatTrafMode(code: string): string {
+  const result = trafMode.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+// 监管方式
+function formatTradeMode(code: string): string {
+  const result = tradeMode.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+function formatCountry(code: string): string {
+  const result = tradeCountry.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 监管方式
+function formatCountryIso(code: string): string {
+  const result = countryIso.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+// 进出境口岸
+function formatIePort(code: string): string {
+  const result = iePort.value.find((item) => item.value == code)
+  if (result) {
+    return result.label
+  }
+  return ''
+}
+
+async function onQuery(entryId: string) {
+  loading.value = true
+  const res = await getEntryHead(entryId)
+  if (res.code === SuccessResultCode) {
+    info.value = res.data?.info
+    tableData.value = res.data.list
+    rowData.value = tableData.value?.[0]
+  }
+  loading.value = false
+}
+
+function onGoBack() {
+  router.back()
+}
+async function getIePort() {
+  const traf = await getBaseCodeList("customsCode")
+  if (traf.code == SuccessResultCode) {
+    iePort.value = traf.data
+  }
+}
+
+async function getTrafMode() {
+  const traf = await getBaseCodeList("TransitMode")
+  if (traf.code == SuccessResultCode) {
+    trafMode.value = traf.data
+  }
+}
+
+async function getTradeMode() {
+  const traf = await getBaseCodeList("tradeCode")
+  if (traf.code == SuccessResultCode) {
+    tradeMode.value = traf.data
+  }
+}
+
+async function getTradeCountry() {
+  const traf = await getBaseCodeList("countryCode")
+  if (traf.code == SuccessResultCode) {
+    tradeCountry.value = traf.data
+  }
+}
+
+async function getCountryIso() {
+  const traf = await getBaseCodeList("countryIsoE")
+  if (traf.code == SuccessResultCode) {
+    countryIso.value = traf.data
+  }
+}
+
+async function getUnit() {
+  const traf = await getBaseCodeList("unit")
+  if (traf.code == SuccessResultCode) {
+    unit.value = traf.data
+  }
+}
+
+onMounted(async () => {
+  const entryId = route.query.entryId as string
+  if (entryId) {
+    await Promise.all([getIePort(),getTrafMode(), getTradeMode(), getTradeCountry(), getCountryIso(),getUnit()])
+    onQuery(entryId)
+  }
+})
+
+watch(
+    () => rowData.value,
+    async () => {
+      detailLoading.value = true
+      detailLoading.value = false
+    }
+)
+</script>
+<style scoped lang="less">
+.typical-three {
+  width: 100%;
+}
+</style>

+ 167 - 150
wxjy-wxjy-web/src/views/analyze/GoodsEntry.vue

@@ -114,10 +114,12 @@
         </el-form-item>
 
         <el-form-item label="结关开始时间" prop="beginReleaseDate">
-          <el-date-picker v-model="state.queryData.beginReleaseDate" clearable />
+          <el-date-picker type="date" value-format="YYYY-MM-DD" v-model="state.queryData.beginReleaseDate"
+                          :disabled-date="beginDatePickerOptions" clearable />
         </el-form-item>
         <el-form-item label="结关结束时间" prop="endReleaseDate">
-          <el-date-picker v-model="state.queryData.endReleaseDate" clearable />
+          <el-date-picker type="date" value-format="YYYY-MM-DD" v-model="state.queryData.endReleaseDate"
+                          :disabled-date="endDatePickerOptions" clearable />
         </el-form-item>
         <template #buttonGroup>
           <el-button type="primary" @click="onSearch">查询</el-button>
@@ -215,6 +217,15 @@ const countryIso = ref([]);
 
 const now = dayjs();
 
+const endDatePickerOptions = (time:Date) => {
+  if (!state.queryData.beginReleaseDate) return false // 如果没有选择开始日期,结束日期不受限制
+  return time.getTime() < new Date(state.queryData.beginReleaseDate).getTime() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
+
+const beginDatePickerOptions = (time:Date) => {
+  if (!state.queryData.endReleaseDate) return false // 如果没有选择开始日期,结束日期不受限制
+  return time.getTime() > new Date(state.queryData.endReleaseDate).getTime() - 8.64e6;//如果没有后面的-8.64e6就是不可以选择今天的
+}
 // 定义所有列的配置
 const allColumnConfigs: ColumnConfig[] = [
   {
@@ -270,7 +281,7 @@ const allColumnConfigs: ColumnConfig[] = [
   {
     key: 'customsCode',
     property: 'customsCode',
-    label: '主管海关',
+    label: '隶属海关',
     width: 100,
     groupKey: 'entry',
     groupTitle: '报关单信息',
@@ -307,16 +318,14 @@ const allColumnConfigs: ColumnConfig[] = [
     groupTitle: '报关单信息',
     defaultVisible: true
   },
-
-  // 时间信息组
   {
     key: 'ieDate',
     property: 'ieDate',
     label: '进出口时间',
     width: 150,
     sortable: true,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: true,
     isDate: true
   },
@@ -326,8 +335,8 @@ const allColumnConfigs: ColumnConfig[] = [
     label: '申报时间',
     width: 150,
     sortable: true,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: true,
     isDate: true
   },
@@ -337,8 +346,8 @@ const allColumnConfigs: ColumnConfig[] = [
     label: '结关时间',
     width: 150,
     sortable: true,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: true,
     isDate: true
   },
@@ -347,9 +356,9 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'declAdvanceFlag',
     label: '是否提前申报',
     width: 110,
-    groupKey: 'time',
-    groupTitle: '时间信息',
-    defaultVisible: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false,
     isDict: true,
     dictKey: 'yes_no'
   },
@@ -358,8 +367,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'acceptDate',
     label: '自动受理时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -368,8 +377,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'exInPortDate',
     label: '货物进港时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -378,8 +387,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'orderReceiveDate',
     label: '现场接单时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -388,8 +397,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'certRlsDate',
     label: '单证放行时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -398,8 +407,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'preReleaseDate',
     label: '担保放行时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -408,8 +417,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'examDate',
     label: '转关数据发送时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -418,8 +427,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'checkDate',
     label: '转关数据核销时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -428,8 +437,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'assessStartDate',
     label: '现场验估时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
@@ -438,41 +447,21 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'assessEndDate',
     label: '验估处置完毕时间',
     width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
-    defaultVisible: false,
-    isDate: true
-  },
-  {
-    key: 'manCreateTime',
-    property: 'manCreateTime',
-    label: '查验指令下达时间',
-    width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
-    defaultVisible: false,
-    isDate: true
-  },
-  {
-    key: 'manChkTimeStart',
-    property: 'manChkTimeStart',
-    label: '查验开始时间',
-    width: 150,
-    sortable: true,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
     isDate: true
   },
   {
-    key: 'manChkTimeEnd',
-    property: 'manChkTimeEnd',
-    label: '查验结束时间',
-    width: 150,
-    groupKey: 'time',
-    groupTitle: '时间信息',
+    key: 'newTwoStepFlag',
+    property: 'newTwoStepFlag',
+    label: '是否新两步申报',
+    width: 120,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false,
-    isDate: true
+    isDict: true,
+    dictKey: 'yes_no'
   },
 
   // 单位信息组
@@ -481,53 +470,56 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'consignCode',
     label: '境内收发货人代码',
     width: 130,
-    groupKey: 'company',
-    groupTitle: '单信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'consignName',
     property: 'consignName',
     label: '境内收发货人名称',
+    width: 130,
     showOverflowTooltip: true,
-    groupKey: 'company',
-    groupTitle: '单信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'frnConsignCode',
     property: 'frnConsignCode',
     label: '境外收发货人代码',
     width: 130,
-    groupKey: 'company',
-    groupTitle: '单信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'frnConsignName',
     property: 'frnConsignName',
     label: '境外收发货人名称(中文)',
+    width: 170,
     showOverflowTooltip: true,
-    groupKey: 'company',
-    groupTitle: '单信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'agentCode',
     property: 'agentCode',
     label: '申报单位代码',
-    width: 130,
-    groupKey: 'company',
-    groupTitle: '单信息',
+    width: 110,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
   {
     key: 'agentName',
     property: 'agentName',
     label: '申报单位名称',
+    width: 110,
     showOverflowTooltip: true,
-    groupKey: 'company',
-    groupTitle: '单信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
   {
@@ -535,17 +527,18 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'ownerCode',
     label: '生产销售单位代码',
     width: 130,
-    groupKey: 'company',
-    groupTitle: '单信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
   {
     key: 'ownerName',
     property: 'ownerName',
     label: '生产销售单位名称',
+    width: 130,
     showOverflowTooltip: true,
-    groupKey: 'company',
-    groupTitle: '单信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
 
@@ -555,44 +548,35 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'grossWt',
     label: '货运量毛重',
     width: 90,
-    groupKey: 'cargo',
-    groupTitle: '货运信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'netWt',
     property: 'netWt',
     label: '货运量净重',
     width: 90,
-    groupKey: 'cargo',
-    groupTitle: '货运信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'rmbPrice',
     property: 'rmbPrice',
     label: '货运值人民币(总)',
     width: 130,
-    groupKey: 'cargo',
-    groupTitle: '货运信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'usdPrice',
     property: 'usdPrice',
     label: '货运值美元(总)',
     width: 130,
-    groupKey: 'cargo',
-    groupTitle: '货运信息',
-    defaultVisible: true
-  },
-  {
-    key: 'grossWt',
-    property: 'grossWt',
-    label: '货运量毛重',
-    width: 90,
-    groupKey: 'cargo',
-    groupTitle: '货运信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
 
@@ -602,17 +586,17 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'orderReceiveCost',
     label: '接单耗时(小时)',
     width: 120,
-    groupKey: 'duration',
-    groupTitle: '时效信息',
-    defaultVisible: true
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
   },
   {
     key: 'cuCost',
     property: 'cuCost',
     label: '海关通关时间(小时)',
     width: 140,
-    groupKey: 'duration',
-    groupTitle: '时效信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: true
   },
   {
@@ -620,8 +604,8 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'totalCost',
     label: '整体通关时间(小时)',
     width: 140,
-    groupKey: 'duration',
-    groupTitle: '时效信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: true
   },
   {
@@ -629,8 +613,17 @@ const allColumnConfigs: ColumnConfig[] = [
     property: 'beforeDeclCost',
     label: '申报前准备时间(小时)',
     width: 150,
-    groupKey: 'duration',
-    groupTitle: '时效信息',
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
+    defaultVisible: false
+  },
+  {
+    key: 'noteS',
+    property: 'noteS',
+    label: '备注',
+    showOverflowTooltip: true,
+    groupKey: 'entry',
+    groupTitle: '报关单信息',
     defaultVisible: false
   },
 
@@ -642,7 +635,7 @@ const allColumnConfigs: ColumnConfig[] = [
     width: 80,
     groupKey: 'inspection',
     groupTitle: '查验信息',
-    defaultVisible: true,
+    defaultVisible: false,
     isDict: true,
     dictKey: 'yes_no'
   },
@@ -657,6 +650,37 @@ const allColumnConfigs: ColumnConfig[] = [
     isDict: true,
     dictKey: 'affiliation_customs_info'
   },
+  {
+    key: 'manCreateTime',
+    property: 'manCreateTime',
+    label: '查验指令下达时间',
+    width: 150,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'manChkTimeStart',
+    property: 'manChkTimeStart',
+    label: '查验开始时间',
+    width: 150,
+    sortable: true,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
+  {
+    key: 'manChkTimeEnd',
+    property: 'manChkTimeEnd',
+    label: '查验结束时间',
+    width: 150,
+    groupKey: 'inspection',
+    groupTitle: '查验信息',
+    defaultVisible: false,
+    isDate: true
+  },
   {
     key: 'manProcResult',
     property: 'manProcResult',
@@ -692,17 +716,6 @@ const allColumnConfigs: ColumnConfig[] = [
     isDict: true,
     dictKey: 'yes_no'
   },
-  {
-    key: 'newTwoStepFlag',
-    property: 'newTwoStepFlag',
-    label: '是否新两步申报',
-    width: 120,
-    groupKey: 'inspection',
-    groupTitle: '查验信息',
-    defaultVisible: false,
-    isDict: true,
-    dictKey: 'yes_no'
-  },
 
   // 商品信息组
   {
@@ -730,12 +743,13 @@ const allColumnConfigs: ColumnConfig[] = [
     width: 100,
     groupKey: 'goods',
     groupTitle: '商品信息',
-    defaultVisible: false
+    defaultVisible: true
   },
   {
     key: 'gname',
     property: 'gname',
     label: '商品名称',
+    width: 100,
     showOverflowTooltip: true,
     groupKey: 'goods',
     groupTitle: '商品信息',
@@ -745,6 +759,7 @@ const allColumnConfigs: ColumnConfig[] = [
     key: 'gmodel',
     property: 'gmodel',
     label: '规格型号',
+    width: 100,
     showOverflowTooltip: true,
     groupKey: 'goods',
     groupTitle: '商品信息',
@@ -795,6 +810,26 @@ const allColumnConfigs: ColumnConfig[] = [
     groupTitle: '商品信息',
     defaultVisible: false
   },
+  {
+    key: 'ungFlag',
+    property: 'ungFlag',
+    label: '非危险化学品',
+    width: 110,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false,
+    isDict: true,
+    dictKey: 'yes_no'
+  },
+  {
+    key: 'ungModel',
+    property: 'ungModel',
+    label: '危包规格',
+    width: 110,
+    groupKey: 'goods',
+    groupTitle: '商品信息',
+    defaultVisible: false
+  },
   {
     key: 'ungClassify',
     property: 'ungClassify',
@@ -808,6 +843,7 @@ const allColumnConfigs: ColumnConfig[] = [
     key: 'ungGName',
     property: 'ungGName',
     label: '危险货物名称',
+    width: 110,
     showOverflowTooltip: true,
     groupKey: 'goods',
     groupTitle: '商品信息',
@@ -832,17 +868,6 @@ const allColumnConfigs: ColumnConfig[] = [
     defaultVisible: true,
     isDict: true,
     dictKey: 'goods_type'
-  },
-
-  // 其他信息组
-  {
-    key: 'noteS',
-    property: 'noteS',
-    label: '备注',
-    showOverflowTooltip: true,
-    groupKey: 'other',
-    groupTitle: '其他信息',
-    defaultVisible: false
   }
 ];
 
@@ -874,7 +899,7 @@ const state = reactive<State>({
     tradeMode: '',
     declMode: '',
     checkFlag: '',
-    goodsType: '1'
+    goodsType: '2'
   },
   isSelect: false,
 })
@@ -893,20 +918,19 @@ const actions = <Array<TableAction>>[
   },
   {
     key: '2',
+    text: '动态列设置',
+    onclick: onColumnsSelector,
+    limit: 'none',
+    type: 'primary'
+  },
+  {
+    key: '3',
     text: '导出',
     confirm: true,
     onclick: onExportData,
     limit: permissionStatus('none', 'GOODS_ENTRY_EXPORT_BT'),
     type: 'primary'
   },
-  {
-    key: '3',
-    text: '动态列设置',
-    onclick: onColumnsSelector,
-    limit: 'none',
-    // limit: permissionStatus('none', 'GOODS_ENTRY_EXPORT_BT'),
-    type: 'primary'
-  }
 ]
 
 const getColumnProps = (column: any) => {
@@ -1020,23 +1044,17 @@ async function onLoadData() {
     state.queryData.customsCode = loginCustomsCode;
     state.isSelect = false;
   }
-  console.log(state.isSelect);
   const query = { ...state.queryData, pageIndex: tablePagination.currentPage, pageSize: tablePagination.pageSize }
   setLoading(true)
   const res = await getList(query)
   if (res.code == SuccessResultCode) {
     setPagination(res.data)
   }
-  // const port = await getBaseCodeList("customsCode")
-  // if (port.code == SuccessResultCode) {
-  //   iePort.value = port.data
-  // }
   setLoading(false)
 }
 
 // 加载数据
 async function onExportData() : Promise<void>{
-  console.log(dynamicColumns.selectedKeys.value)
   const query = { ...state.queryData,exportHeadList:dynamicColumns.selectedKeys.value.toString()}
   await exportList(query);
 }
@@ -1079,7 +1097,6 @@ async function getCountryIso() {
 onBeforeMount(async () => {
   await Promise.all([ getCustoms(),getTrafMode(),getTradeMode(),getTradeCountry(),getCountryIso()])
   setTimeout(() => {
-    console.log('字典数据:', dict)
     onLoadData()
   }, 500)
 //  console.log(dict);