Browse Source

代码生成功能。可生成前端代码

xiongwanxiong 2 months ago
parent
commit
f6b22fa220
58 changed files with 9299 additions and 4640 deletions
  1. 114 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/EntryHeadController.java
  2. 114 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/NewDeclaredGoodsController.java
  3. 72 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/dao/EntryHeadMapper.java
  4. 72 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/dao/NewDeclaredGoodsMapper.java
  5. 242 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/EntryHead.java
  6. 192 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/EntryHeadQuery.java
  7. 254 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/NewDeclaredGoods.java
  8. 201 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/NewDeclaredGoodsQuery.java
  9. 89 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/IEntryHeadService.java
  10. 89 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/INewDeclaredGoodsService.java
  11. 171 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/impl/EntryHeadServiceImpl.java
  12. 172 0
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/impl/NewDeclaredGoodsServiceImpl.java
  13. 1 1
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/generator/service/GenTableServiceImpl.java
  14. 35 29
      wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/generator/util/VelocityUtils.java
  15. 667 0
      wxjy-wxjy-service/src/main/resources/mapper/analyze/EntryHeadMapper.xml
  16. 700 0
      wxjy-wxjy-service/src/main/resources/mapper/analyze/NewDeclaredGoodsMapper.xml
  17. 0 149
      wxjy-wxjy-service/src/main/resources/vm-xiong/java/controller.java.vm
  18. 0 79
      wxjy-wxjy-service/src/main/resources/vm-xiong/java/service.java.vm
  19. 0 244
      wxjy-wxjy-service/src/main/resources/vm-xiong/java/serviceImpl.java.vm
  20. 0 44
      wxjy-wxjy-service/src/main/resources/vm-xiong/js/api.js.vm
  21. 0 3
      wxjy-wxjy-service/src/main/resources/vm-xiong/sql/sql.vm
  22. 0 24
      wxjy-wxjy-service/src/main/resources/vm-xiong/sql/sql_bak.vm
  23. 0 505
      wxjy-wxjy-service/src/main/resources/vm-xiong/vue/index-tree.vue.vm
  24. 0 778
      wxjy-wxjy-service/src/main/resources/vm-xiong/vue/index.vue.vm
  25. 0 474
      wxjy-wxjy-service/src/main/resources/vm-xiong/vue/v3/index-tree.vue.vm
  26. 0 702
      wxjy-wxjy-service/src/main/resources/vm-xiong/vue/v3/index.vue.vm
  27. 93 80
      wxjy-wxjy-service/src/main/resources/vm/java/controller.java.vm
  28. 2 1
      wxjy-wxjy-service/src/main/resources/vm/java/dao.java.vm
  29. 0 124
      wxjy-wxjy-service/src/main/resources/vm/java/domain.java.vm
  30. 0 17
      wxjy-wxjy-service/src/main/resources/vm/java/domainQuery.java.vm
  31. 0 101
      wxjy-wxjy-service/src/main/resources/vm/java/mapper.java.vm
  32. 3 3
      wxjy-wxjy-service/src/main/resources/vm/java/pojo.java.vm
  33. 65 0
      wxjy-wxjy-service/src/main/resources/vm/java/pojoQuery.java.vm
  34. 64 55
      wxjy-wxjy-service/src/main/resources/vm/java/service.java.vm
  35. 197 213
      wxjy-wxjy-service/src/main/resources/vm/java/serviceImpl.java.vm
  36. 0 73
      wxjy-wxjy-service/src/main/resources/vm/java/sub-domain.java.vm
  37. 29 32
      wxjy-wxjy-service/src/main/resources/vm/js/api.js.vm
  38. 49 0
      wxjy-wxjy-service/src/main/resources/vm/type/type.ts.vm
  39. 701 751
      wxjy-wxjy-service/src/main/resources/vm/vue/index.vue.vm
  40. 1 1
      wxjy-wxjy-service/src/main/resources/vm/xml/dao.xml.vm
  41. 0 155
      wxjy-wxjy-service/src/main/resources/vm/xml/mapper.xml.vm
  42. 1 0
      wxjy-wxjy-web/package.json
  43. 32 1
      wxjy-wxjy-web/src/App.vue
  44. 41 0
      wxjy-wxjy-web/src/apis/analyze/EntryHead.ts
  45. 41 0
      wxjy-wxjy-web/src/apis/analyze/NewDeclaredGoods.ts
  46. 1 1
      wxjy-wxjy-web/src/apis/gen/gen.ts
  47. 171 0
      wxjy-wxjy-web/src/components/RightToolbar/index.vue
  48. 30 0
      wxjy-wxjy-web/src/router/app-router.ts
  49. 122 0
      wxjy-wxjy-web/src/types/analyze/EntryHead.ts
  50. 128 0
      wxjy-wxjy-web/src/types/analyze/NewDeclaredGoods.ts
  51. 1178 0
      wxjy-wxjy-web/src/views/analyze/EntryHead.vue
  52. 1238 0
      wxjy-wxjy-web/src/views/analyze/NewDeclaredGoods.vue
  53. 74 0
      wxjy-wxjy-web/src/views/gen/basicInfoForm.vue
  54. 70 0
      wxjy-wxjy-web/src/views/gen/createTable.vue
  55. 403 0
      wxjy-wxjy-web/src/views/gen/editTable.vue
  56. 734 0
      wxjy-wxjy-web/src/views/gen/genIndex.vue
  57. 408 0
      wxjy-wxjy-web/src/views/gen/genInfoForm.vue
  58. 238 0
      wxjy-wxjy-web/src/views/gen/importTable.vue

+ 114 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/EntryHeadController.java

@@ -0,0 +1,114 @@
+package cn.gov.customs.wxjy.analyze.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.gov.customs.cacp.sdks.core.result.Result;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.cacp.sdks.core.user.trans.UserContextHolder;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import cn.gov.customs.wxjy.common.core.controller.BaseController;
+import org.springframework.web.multipart.MultipartFile;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHead;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHeadQuery;
+import cn.gov.customs.wxjy.analyze.service.IEntryHeadService;
+import cn.gov.customs.wxjy.common.utils.poi.ExcelUtil;
+import cn.gov.customs.wxjy.common.core.page.TableDataInfo;
+
+/**
+ * 危险品报关单头Controller
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@RestController
+@RequestMapping("/analyze/EntryHead")
+@RequiredArgsConstructor
+public class EntryHeadController extends BaseController {
+
+    private final IEntryHeadService entryHeadService;
+
+    /**
+     * 查询危险品报关单头列表
+     */
+    @PostMapping("/get-list")
+    public Result<PageInfo<EntryHead>> list(@RequestBody EntryHeadQuery query) {
+        PageHelper.startPage(query.getPageIndex(), query.getPageSize());
+        PageInfo<EntryHead> list = entryHeadService.selectPageList(query);
+        return Result.success(list);
+    }
+
+    /**
+     * 获取危险品报关单头详细信息
+     */
+    @GetMapping(value = "/get-detail")
+    public Result<EntryHead> getInfo(@RequestParam String entryId) {
+        return Result.success(entryHeadService.selectByEntryId(entryId));
+    }
+
+    /**
+     * 新增危险品报关单头
+     */
+    @PostMapping("/insert-entryHead")
+    public Result<Integer> add(@RequestBody EntryHead entryHead) {
+        return Result.success(entryHeadService.insert(entryHead));
+    }
+
+    /**
+     * 修改危险品报关单头
+     */
+    @PostMapping("/update-entryHead")
+    public Result<Integer> edit(@RequestBody EntryHead entryHead) {
+        return Result.success(entryHeadService.update(entryHead));
+    }
+
+    /**
+     * 删除危险品报关单头
+     */
+    @PostMapping("/delete-entryHead")
+    public Result<Integer> remove(@PathVariable String[] ids) {
+        return Result.success(entryHeadService.deleteByEntryIds(ids));
+    }
+
+    /**
+    * 导入 危险品报关单头
+    * @param file
+    * @param updateSupport
+    * @return
+    * @throws Exception
+    */
+    @PostMapping("/import-entryHead")
+    public Result<String> importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        CacpTransUser user = UserContextHolder.currentUser();
+        ExcelUtil<EntryHead> util = new ExcelUtil<EntryHead>(EntryHead.class);
+        List<EntryHead> entryHeadList = util.importExcel(file.getInputStream());
+        String message = entryHeadService.importEntryHead(entryHeadList, updateSupport, user);
+        return Result.success(message);
+    }
+
+    /**
+     * 导出危险品报关单头列表
+     */
+    @PostMapping("/get-entryHead-export")
+    public void export(HttpServletResponse response, @RequestBody EntryHeadQuery query) {
+        List<EntryHead> list = entryHeadService.selectList(query);
+        ExcelUtil<EntryHead> util = new ExcelUtil<EntryHead>(EntryHead. class);
+        util.exportExcel(response, list, "危险品报关单头数据");
+    }
+
+    /**
+    * 获取导入模板
+    * @param response
+    */
+    @PostMapping("/template-entryHead")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<EntryHead> util = new ExcelUtil<EntryHead>(EntryHead.class);
+        util.importTemplateExcel(response, "危险品报关单头");
+    }
+}

+ 114 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/controller/NewDeclaredGoodsController.java

@@ -0,0 +1,114 @@
+package cn.gov.customs.wxjy.analyze.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.gov.customs.cacp.sdks.core.result.Result;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.cacp.sdks.core.user.trans.UserContextHolder;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import cn.gov.customs.wxjy.common.core.controller.BaseController;
+import org.springframework.web.multipart.MultipartFile;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoods;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoodsQuery;
+import cn.gov.customs.wxjy.analyze.service.INewDeclaredGoodsService;
+import cn.gov.customs.wxjy.common.utils.poi.ExcelUtil;
+import cn.gov.customs.wxjy.common.core.page.TableDataInfo;
+
+/**
+ * 新申报商品提示Controller
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@RestController
+@RequestMapping("/analyze/NewDeclaredGoods")
+@RequiredArgsConstructor
+public class NewDeclaredGoodsController extends BaseController {
+
+    private final INewDeclaredGoodsService newDeclaredGoodsService;
+
+    /**
+     * 查询新申报商品提示列表
+     */
+    @PostMapping("/get-list")
+    public Result<PageInfo<NewDeclaredGoods>> list(@RequestBody NewDeclaredGoodsQuery query) {
+        PageHelper.startPage(query.getPageIndex(), query.getPageSize());
+        PageInfo<NewDeclaredGoods> list = newDeclaredGoodsService.selectPageList(query);
+        return Result.success(list);
+    }
+
+    /**
+     * 获取新申报商品提示详细信息
+     */
+    @GetMapping(value = "/get-detail")
+    public Result<NewDeclaredGoods> getInfo(@RequestParam String ID) {
+        return Result.success(newDeclaredGoodsService.selectByID(ID));
+    }
+
+    /**
+     * 新增新申报商品提示
+     */
+    @PostMapping("/insert-newDeclaredGoods")
+    public Result<Integer> add(@RequestBody NewDeclaredGoods newDeclaredGoods) {
+        return Result.success(newDeclaredGoodsService.insert(newDeclaredGoods));
+    }
+
+    /**
+     * 修改新申报商品提示
+     */
+    @PostMapping("/update-newDeclaredGoods")
+    public Result<Integer> edit(@RequestBody NewDeclaredGoods newDeclaredGoods) {
+        return Result.success(newDeclaredGoodsService.update(newDeclaredGoods));
+    }
+
+    /**
+     * 删除新申报商品提示
+     */
+    @PostMapping("/delete-newDeclaredGoods")
+    public Result<Integer> remove(@PathVariable String[] ids) {
+        return Result.success(newDeclaredGoodsService.deleteByIDs(ids));
+    }
+
+    /**
+    * 导入 新申报商品提示
+    * @param file
+    * @param updateSupport
+    * @return
+    * @throws Exception
+    */
+    @PostMapping("/import-newDeclaredGoods")
+    public Result<String> importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        CacpTransUser user = UserContextHolder.currentUser();
+        ExcelUtil<NewDeclaredGoods> util = new ExcelUtil<NewDeclaredGoods>(NewDeclaredGoods.class);
+        List<NewDeclaredGoods> newDeclaredGoodsList = util.importExcel(file.getInputStream());
+        String message = newDeclaredGoodsService.importNewDeclaredGoods(newDeclaredGoodsList, updateSupport, user);
+        return Result.success(message);
+    }
+
+    /**
+     * 导出新申报商品提示列表
+     */
+    @PostMapping("/get-newDeclaredGoods-export")
+    public void export(HttpServletResponse response, @RequestBody NewDeclaredGoodsQuery query) {
+        List<NewDeclaredGoods> list = newDeclaredGoodsService.selectList(query);
+        ExcelUtil<NewDeclaredGoods> util = new ExcelUtil<NewDeclaredGoods>(NewDeclaredGoods. class);
+        util.exportExcel(response, list, "新申报商品提示数据");
+    }
+
+    /**
+    * 获取导入模板
+    * @param response
+    */
+    @PostMapping("/template-newDeclaredGoods")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<NewDeclaredGoods> util = new ExcelUtil<NewDeclaredGoods>(NewDeclaredGoods.class);
+        util.importTemplateExcel(response, "新申报商品提示");
+    }
+}

+ 72 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/dao/EntryHeadMapper.java

@@ -0,0 +1,72 @@
+package cn.gov.customs.wxjy.analyze.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHead;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHeadQuery;
+
+/**
+ * 危险品报关单头Mapper接口
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Mapper
+public interface EntryHeadMapper {
+    /**
+     * 查询危险品报关单头
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 危险品报关单头
+     */
+    public EntryHead selectByEntryId(String entryId);
+
+    /**
+     * 查询危险品报关单头列表
+     *
+     * @param entryHead 危险品报关单头
+     * @return 危险品报关单头集合
+     */
+    public List<EntryHead> selectList(EntryHeadQuery entryHead);
+
+    /**
+     * 新增危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    public int insert(EntryHead entryHead);
+
+    /**
+     * 修改危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    public int update(EntryHead entryHead);
+
+    /**
+     * 删除危险品报关单头
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    public int deleteByEntryId(String entryId);
+
+    /**
+     * 批量删除危险品报关单头
+     *
+     * @param entryIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteByEntryIds(String[] entryIds);
+
+    /**
+     * 逻辑删除危险品报关单头
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    public int logicDelete(String entryId);
+}

+ 72 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/dao/NewDeclaredGoodsMapper.java

@@ -0,0 +1,72 @@
+package cn.gov.customs.wxjy.analyze.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoods;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoodsQuery;
+
+/**
+ * 新申报商品提示Mapper接口
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Mapper
+public interface NewDeclaredGoodsMapper {
+    /**
+     * 查询新申报商品提示
+     *
+     * @param ID 新申报商品提示主键
+     * @return 新申报商品提示
+     */
+    public NewDeclaredGoods selectByID(String ID);
+
+    /**
+     * 查询新申报商品提示列表
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 新申报商品提示集合
+     */
+    public List<NewDeclaredGoods> selectList(NewDeclaredGoodsQuery newDeclaredGoods);
+
+    /**
+     * 新增新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    public int insert(NewDeclaredGoods newDeclaredGoods);
+
+    /**
+     * 修改新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    public int update(NewDeclaredGoods newDeclaredGoods);
+
+    /**
+     * 删除新申报商品提示
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    public int deleteByID(String ID);
+
+    /**
+     * 批量删除新申报商品提示
+     *
+     * @param IDs 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteByIDs(String[] IDs);
+
+    /**
+     * 逻辑删除新申报商品提示
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    public int logicDelete(String ID);
+}

+ 242 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/EntryHead.java

@@ -0,0 +1,242 @@
+package cn.gov.customs.wxjy.analyze.pojo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import cn.gov.customs.wxjy.common.annotation.Excel;
+import cn.gov.customs.wxjy.common.core.domain.BaseEntity;
+
+/**
+ * 危险品报关单头对象 WXJY_ENTRY_HEAD
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Data
+public class EntryHead extends BaseEntity {
+private static final long serialVersionUID = 1L;
+
+    /** 报关单号 */
+    private String entryId;
+
+    /** 维护状态 */
+    @Excel(name = "维护状态")
+    private String mainStatus;
+
+    /** 通关模式 */
+    @Excel(name = "通关模式")
+    private String passMode;
+
+    /** 运输方式 */
+    @Excel(name = "运输方式")
+    private String trafMode;
+
+    /** 出入境标志 */
+    @Excel(name = "出入境标志")
+    private String iEFlag;
+
+    /** 进出境口岸 */
+    @Excel(name = "进出境口岸")
+    private String iEPort;
+
+    /** 申报口岸 */
+    @Excel(name = "申报口岸")
+    private String declPort;
+
+    /** 货物运抵(进出口)时间 */
+    @Excel(name = "货物运抵(进出口)时间")
+    private String iEDate;
+
+    /** 申报时间 */
+    @Excel(name = "申报时间")
+    private String declDate;
+
+    /** 是否提前申报标记 */
+    @Excel(name = "是否提前申报标记")
+    private String declAdvanceFlag;
+
+    /** 自动受理时间 */
+    @Excel(name = "自动受理时间")
+    private String acceptDate;
+
+    /** 出境报关单-货物进港时间 */
+    @Excel(name = "出境报关单-货物进港时间")
+    private String exInPortDate;
+
+    /** 境内收发货人代码 */
+    @Excel(name = "境内收发货人代码")
+    private String consignScc;
+
+    /** 境内收发货人代码 */
+    @Excel(name = "境内收发货人代码")
+    private String consignCode;
+
+    /** 境内收发货人名称 */
+    @Excel(name = "境内收发货人名称")
+    private String consignName;
+
+    /** 境外收发货人代码 */
+    @Excel(name = "境外收发货人代码")
+    private String frnConsignCode;
+
+    /** 境外收发货人名称(中文) */
+    @Excel(name = "境外收发货人名称(中文)")
+    private String frnConsignName;
+
+    /** 监管方式 */
+    @Excel(name = "监管方式")
+    private String tradeMode;
+
+    /** 贸易国别代码 */
+    @Excel(name = "贸易国别代码")
+    private String tradeCountry;
+
+    /** 货运量毛重 */
+    @Excel(name = "货运量毛重")
+    private String grossWt;
+
+    /** 货运量净重 */
+    @Excel(name = "货运量净重")
+    private String netWt;
+
+    /** 货运值人民币 */
+    @Excel(name = "货运值人民币")
+    private String rmbPrice;
+
+    /** 货运值美元 */
+    @Excel(name = "货运值美元")
+    private String usdPrice;
+
+    /** 集装箱数量 */
+    @Excel(name = "集装箱数量")
+    private String CONTAINER;
+
+    /** 报关模式 */
+    @Excel(name = "报关模式")
+    private String declMode;
+
+    /** 报关单状态 */
+    @Excel(name = "报关单状态")
+    private String declStatus;
+
+    /** 现场接单时间 */
+    @Excel(name = "现场接单时间")
+    private String orderReceiveDate;
+
+    /** 接单耗时即单证审核时长(秒) */
+    @Excel(name = "接单耗时即单证审核时长(秒)")
+    private String orderReceiveCost;
+
+    /** 单证放行时间 */
+    @Excel(name = "单证放行时间")
+    private String certRlsDate;
+
+    /** 担保放行时间 */
+    @Excel(name = "担保放行时间")
+    private String preReleaseDate;
+
+    /** 申报单位代码 */
+    @Excel(name = "申报单位代码")
+    private String agentCode;
+
+    /** 申报单位名称 */
+    @Excel(name = "申报单位名称")
+    private String agentName;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String noteS;
+
+    /** 生产销售单位代码 */
+    @Excel(name = "生产销售单位代码")
+    private String ownerCode;
+
+    /** 生产销售单位名称 */
+    @Excel(name = "生产销售单位名称")
+    private String ownerName;
+
+    /** 转关数据发送时间 */
+    @Excel(name = "转关数据发送时间")
+    private String examDate;
+
+    /** 转关数据核销时间 */
+    @Excel(name = "转关数据核销时间")
+    private String checkDate;
+
+    /** 完整申报电子申报时间 */
+    @Excel(name = "完整申报电子申报时间")
+    private String compEleDate;
+
+    /** 结关时间 */
+    @Excel(name = "结关时间")
+    private String releaseDate;
+
+    /** 海关通关时间(秒) */
+    @Excel(name = "海关通关时间(秒)")
+    private String cuCost;
+
+    /** 总体通关时间(秒) */
+    @Excel(name = "总体通关时间(秒)")
+    private String totalCost;
+
+    /** 申报前准备时间(秒) */
+    @Excel(name = "申报前准备时间(秒)")
+    private String beforeDeclCost;
+
+    /** 是否专业审单 */
+    @Excel(name = "是否专业审单")
+    private String profVerifyFlag;
+
+    /** 是否新两步申报标记 */
+    @Excel(name = "是否新两步申报标记")
+    private String newTwoStepFlag;
+
+    /** 电子申报时间 */
+    @Excel(name = "电子申报时间")
+    private String eleDeclDate;
+
+    /** 现场验估时间 */
+    @Excel(name = "现场验估时间")
+    private String assessStartDate;
+
+    /** 验估处置完毕时间 */
+    @Excel(name = "验估处置完毕时间")
+    private String assessEndDate;
+
+    /** 退单时间 */
+    @Excel(name = "退单时间")
+    private String refundDate;
+
+    /** 是否退过单标记 */
+    @Excel(name = "是否退过单标记")
+    private String refundFlag;
+
+    /** 查验指令下达时间 */
+    @Excel(name = "查验指令下达时间")
+    private String manCreateTime;
+
+    /** 查验开始时间 */
+    @Excel(name = "查验开始时间")
+    private String manChkTimeStart;
+
+    /** 查验结束时间 */
+    @Excel(name = "查验结束时间")
+    private String manChkTimeEnd;
+
+    /** 查验关区 */
+    @Excel(name = "查验关区")
+    private String checkCustomsCode;
+
+    /** 是否查验 */
+    @Excel(name = "是否查验")
+    private String checkFlag;
+
+    /** 处理结果 */
+    @Excel(name = "处理结果")
+    private String manProcResult;
+
+    /** 处理意见 */
+    @Excel(name = "处理意见")
+    private String manProcIdea;
+
+}

+ 192 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/EntryHeadQuery.java

@@ -0,0 +1,192 @@
+package cn.gov.customs.wxjy.analyze.pojo;
+
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 危险品报关单头对象 WXJY_ENTRY_HEAD
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Data
+public class EntryHeadQuery implements Serializable {
+
+    /** 报关单号 */
+    private String entryId;
+
+    /** 维护状态 */
+                    private String mainStatus;
+
+    /** 通关模式 */
+                    private String passMode;
+
+    /** 运输方式 */
+                    private String trafMode;
+
+    /** 出入境标志 */
+                    private String iEFlag;
+
+    /** 进出境口岸 */
+                    private String iEPort;
+
+    /** 申报口岸 */
+                    private String declPort;
+
+    /** 货物运抵(进出口)时间 */
+                    private String iEDate;
+
+    /** 申报时间 */
+                    private String declDate;
+
+    /** 是否提前申报标记 */
+                    private String declAdvanceFlag;
+
+    /** 自动受理时间 */
+                    private String acceptDate;
+
+    /** 出境报关单-货物进港时间 */
+                    private String exInPortDate;
+
+    /** 境内收发货人代码 */
+                    private String consignScc;
+
+    /** 境内收发货人代码 */
+                    private String consignCode;
+
+    /** 境内收发货人名称 */
+                    private String consignName;
+
+    /** 境外收发货人代码 */
+                    private String frnConsignCode;
+
+    /** 境外收发货人名称(中文) */
+                    private String frnConsignName;
+
+    /** 监管方式 */
+                    private String tradeMode;
+
+    /** 贸易国别代码 */
+                    private String tradeCountry;
+
+    /** 货运量毛重 */
+                    private String grossWt;
+
+    /** 货运量净重 */
+                    private String netWt;
+
+    /** 货运值人民币 */
+                    private String rmbPrice;
+
+    /** 货运值美元 */
+                    private String usdPrice;
+
+    /** 集装箱数量 */
+                    private String CONTAINER;
+
+    /** 报关模式 */
+                    private String declMode;
+
+    /** 报关单状态 */
+                    private String declStatus;
+
+    /** 现场接单时间 */
+                    private String orderReceiveDate;
+
+    /** 接单耗时即单证审核时长(秒) */
+                    private String orderReceiveCost;
+
+    /** 单证放行时间 */
+                    private String certRlsDate;
+
+    /** 担保放行时间 */
+                    private String preReleaseDate;
+
+    /** 申报单位代码 */
+                    private String agentCode;
+
+    /** 申报单位名称 */
+                    private String agentName;
+
+    /** 备注 */
+                    private String noteS;
+
+    /** 生产销售单位代码 */
+                    private String ownerCode;
+
+    /** 生产销售单位名称 */
+                    private String ownerName;
+
+    /** 转关数据发送时间 */
+                    private String examDate;
+
+    /** 转关数据核销时间 */
+                    private String checkDate;
+
+    /** 完整申报电子申报时间 */
+                    private String compEleDate;
+
+    /** 结关时间 */
+                    private String releaseDate;
+
+    /** 海关通关时间(秒) */
+                    private String cuCost;
+
+    /** 总体通关时间(秒) */
+                    private String totalCost;
+
+    /** 申报前准备时间(秒) */
+                    private String beforeDeclCost;
+
+    /** 是否专业审单 */
+                    private String profVerifyFlag;
+
+    /** 是否新两步申报标记 */
+                    private String newTwoStepFlag;
+
+    /** 电子申报时间 */
+                    private String eleDeclDate;
+
+    /** 现场验估时间 */
+                    private String assessStartDate;
+
+    /** 验估处置完毕时间 */
+                    private String assessEndDate;
+
+    /** 退单时间 */
+                    private String refundDate;
+
+    /** 是否退过单标记 */
+                    private String refundFlag;
+
+    /** 查验指令下达时间 */
+                    private String manCreateTime;
+
+    /** 查验开始时间 */
+                    private String manChkTimeStart;
+
+    /** 查验结束时间 */
+                    private String manChkTimeEnd;
+
+    /** 查验关区 */
+                    private String checkCustomsCode;
+
+    /** 是否查验 */
+                    private String checkFlag;
+
+    /** 处理结果 */
+                    private String manProcResult;
+
+    /** 处理意见 */
+                    private String manProcIdea;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+    private int pageIndex;
+    private int pageSize;
+}

+ 254 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/NewDeclaredGoods.java

@@ -0,0 +1,254 @@
+package cn.gov.customs.wxjy.analyze.pojo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import cn.gov.customs.wxjy.common.annotation.Excel;
+import cn.gov.customs.wxjy.common.core.domain.BaseEntity;
+
+/**
+ * 新申报商品提示对象 WXJY_NEW_DECLARED_GOODS
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Data
+public class NewDeclaredGoods extends BaseEntity {
+private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private String ID;
+
+    /** 报关单号 */
+    @Excel(name = "报关单号")
+    private String entryId;
+
+    /** 商品序号 */
+    @Excel(name = "商品序号")
+    private String gNo;
+
+    /** 出入境标志 */
+    @Excel(name = "出入境标志")
+    private String ieFlag;
+
+    /** 进出境口岸 */
+    @Excel(name = "进出境口岸")
+    private String iePort;
+
+    /** 申报口岸 */
+    @Excel(name = "申报口岸")
+    private String declPort;
+
+    /** 所属海关 */
+    @Excel(name = "所属海关")
+    private String customsCode;
+
+    /** 申报时间 */
+    @Excel(name = "申报时间")
+    private String declDate;
+
+    /** 境内收发货人代码(统一社会信用代码) */
+    @Excel(name = "境内收发货人代码", readConverterExp = "统=一社会信用代码")
+    private String consignScc;
+
+    /** 境内收发货人代码 */
+    @Excel(name = "境内收发货人代码")
+    private String consignCode;
+
+    /** 境内收发货人名称 */
+    @Excel(name = "境内收发货人名称")
+    private String consignName;
+
+    /** 商品编号 */
+    @Excel(name = "商品编号")
+    private String codeTs;
+
+    /** 检验检疫编码 */
+    @Excel(name = "检验检疫编码")
+    private String iqCode;
+
+    /** 商品名称 */
+    @Excel(name = "商品名称")
+    private String gName;
+
+    /** 报检名称 */
+    @Excel(name = "报检名称")
+    private String iqGName;
+
+    /** 商品英文名称 */
+    @Excel(name = "商品英文名称")
+    private String gNameFn;
+
+    /** 规格型号 */
+    @Excel(name = "规格型号")
+    private String gModel;
+
+    /** 检验检疫货物规格 */
+    @Excel(name = "检验检疫货物规格")
+    private String iqGModel;
+
+    /** 成份/原料/组分 */
+    @Excel(name = "成份/原料/组分")
+    private String gComposition;
+
+    /** 产品保质期 */
+    @Excel(name = "产品保质期")
+    private String prodWarranty;
+
+    /** 产品有效期 */
+    @Excel(name = "产品有效期")
+    private String prodValidaty;
+
+    /** 征免方式 */
+    @Excel(name = "征免方式")
+    private String dutyMode;
+
+    /** 条形码 */
+    @Excel(name = "条形码")
+    private String GTIN;
+
+    /** 申报数量 */
+    @Excel(name = "申报数量")
+    private String gQty;
+
+    /** 申报计量单位 */
+    @Excel(name = "申报计量单位")
+    private String gUnit;
+
+    /** 法定第一数量 */
+    @Excel(name = "法定第一数量")
+    private String qty1;
+
+    /** 法定第一计量单位 */
+    @Excel(name = "法定第一计量单位")
+    private String unit1;
+
+    /** 第二数量 */
+    @Excel(name = "第二数量")
+    private String qty2;
+
+    /** 第二计量单位 */
+    @Excel(name = "第二计量单位")
+    private String unit2;
+
+    /** 申报单价 */
+    @Excel(name = "申报单价")
+    private String declPrice;
+
+    /** 申报总价 */
+    @Excel(name = "申报总价")
+    private String declTotal;
+
+    /** 成交币制 */
+    @Excel(name = "成交币制")
+    private String tradeCurr;
+
+    /** 成交总价 */
+    @Excel(name = "成交总价")
+    private String tradeTotal;
+
+    /** 完税价格 */
+    @Excel(name = "完税价格")
+    private String dutyValue;
+
+    /** 统计人民币价 */
+    @Excel(name = "统计人民币价")
+    private String rmbPrice;
+
+    /** 统计美元价 */
+    @Excel(name = "统计美元价")
+    private String usdPrice;
+
+    /** 成交汇率 */
+    @Excel(name = "成交汇率")
+    private String exchangeRate;
+
+    /** 原产国(地区) */
+    @Excel(name = "原产国", readConverterExp = "地=区")
+    private String originCountry;
+
+    /** 原产地区代码 */
+    @Excel(name = "原产地区代码")
+    private String originRegionCode;
+
+    /** 最终目的国(地区) */
+    @Excel(name = "最终目的国", readConverterExp = "地=区")
+    private String destCountry;
+
+    /** 境内目的地/境内货源地 */
+    @Excel(name = "境内目的地/境内货源地")
+    private String ieDistrictCode;
+
+    /** 目的地/货源地 */
+    @Excel(name = "目的地/货源地")
+    private String iqIeDistrictCode;
+
+    /** 境外生产企业名称 */
+    @Excel(name = "境外生产企业名称")
+    private String frnProducerName;
+
+    /** 货物型号 */
+    @Excel(name = "货物型号")
+    private String productModel;
+
+    /** 货物品牌 */
+    @Excel(name = "货物品牌")
+    private String productBrand;
+
+    /** 生产日期 */
+    @Excel(name = "生产日期")
+    private String productDate;
+
+    /** 生产批次 */
+    @Excel(name = "生产批次")
+    private String productBatch;
+
+    /** UN编码 */
+    @Excel(name = "UN编码")
+    private String UNGID;
+
+    /** 非危险化学品 */
+    @Excel(name = "非危险化学品")
+    private String ungFlag;
+
+    /** 危包规格 */
+    @Excel(name = "危包规格")
+    private String ungModel;
+
+    /** 危包类别 */
+    @Excel(name = "危包类别")
+    private String ungClassify;
+
+    /** 危险货物名称 */
+    @Excel(name = "危险货物名称")
+    private String ungGName;
+
+    /** 货物属性代码 */
+    @Excel(name = "货物属性代码")
+    private String productCharCode;
+
+    /** 货号 */
+    @Excel(name = "货号")
+    private String goodsId;
+
+    /** 用途代码 */
+    @Excel(name = "用途代码")
+    private String useTo;
+
+    /** 每项商品需要监管证件 */
+    @Excel(name = "每项商品需要监管证件")
+    private String gCertFlag;
+
+    /** 生产单位注册号 */
+    @Excel(name = "生产单位注册号")
+    private String mnufctrRegNo;
+
+    /** 危化品目录的CAS号 */
+    @Excel(name = "危化品目录的CAS号")
+    private String CAS;
+
+    /** 危险品类型(1、危化品;2、危险货物;3、危化品兼危险货物) */
+    @Excel(name = "危险品类型", readConverterExp = "1=、危化品;2、危险货物;3、危化品兼危险货物")
+    private String goodsType;
+
+}

+ 201 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/pojo/NewDeclaredGoodsQuery.java

@@ -0,0 +1,201 @@
+package cn.gov.customs.wxjy.analyze.pojo;
+
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 新申报商品提示对象 WXJY_NEW_DECLARED_GOODS
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Data
+public class NewDeclaredGoodsQuery implements Serializable {
+
+    /** 主键 */
+    private String ID;
+
+    /** 报关单号 */
+    private String entryId;
+
+    /** 商品序号 */
+    private String gNo;
+
+    /** 出入境标志 */
+    private String ieFlag;
+
+    /** 进出境口岸 */
+    private String iePort;
+
+    /** 申报口岸 */
+    private String declPort;
+
+    /** 所属海关 */
+    private String customsCode;
+
+    /** 申报时间 */
+    private String declDate;
+
+    /** 境内收发货人代码(统一社会信用代码) */
+    private String consignScc;
+
+    /** 境内收发货人代码 */
+    private String consignCode;
+
+    /** 境内收发货人名称 */
+    private String consignName;
+
+    /** 商品编号 */
+    private String codeTs;
+
+    /** 检验检疫编码 */
+    private String iqCode;
+
+    /** 商品名称 */
+    private String gName;
+
+    /** 报检名称 */
+    private String iqGName;
+
+    /** 商品英文名称 */
+    private String gNameFn;
+
+    /** 规格型号 */
+    private String gModel;
+
+    /** 检验检疫货物规格 */
+    private String iqGModel;
+
+    /** 成份/原料/组分 */
+    private String gComposition;
+
+    /** 产品保质期 */
+    private String prodWarranty;
+
+    /** 产品有效期 */
+    private String prodValidaty;
+
+    /** 征免方式 */
+    private String dutyMode;
+
+    /** 条形码 */
+    private String GTIN;
+
+    /** 申报数量 */
+    private String gQty;
+
+    /** 申报计量单位 */
+    private String gUnit;
+
+    /** 法定第一数量 */
+    private String qty1;
+
+    /** 法定第一计量单位 */
+    private String unit1;
+
+    /** 第二数量 */
+    private String qty2;
+
+    /** 第二计量单位 */
+    private String unit2;
+
+    /** 申报单价 */
+    private String declPrice;
+
+    /** 申报总价 */
+    private String declTotal;
+
+    /** 成交币制 */
+    private String tradeCurr;
+
+    /** 成交总价 */
+    private String tradeTotal;
+
+    /** 完税价格 */
+    private String dutyValue;
+
+    /** 统计人民币价 */
+    private String rmbPrice;
+
+    /** 统计美元价 */
+    private String usdPrice;
+
+    /** 成交汇率 */
+    private String exchangeRate;
+
+    /** 原产国(地区) */
+    private String originCountry;
+
+    /** 原产地区代码 */
+    private String originRegionCode;
+
+    /** 最终目的国(地区) */
+    private String destCountry;
+
+    /** 境内目的地/境内货源地 */
+    private String ieDistrictCode;
+
+    /** 目的地/货源地 */
+    private String iqIeDistrictCode;
+
+    /** 境外生产企业名称 */
+    private String frnProducerName;
+
+    /** 货物型号 */
+    private String productModel;
+
+    /** 货物品牌 */
+    private String productBrand;
+
+    /** 生产日期 */
+    private String productDate;
+
+    /** 生产批次 */
+    private String productBatch;
+
+    /** UN编码 */
+    private String UNGID;
+
+    /** 非危险化学品 */
+    private String ungFlag;
+
+    /** 危包规格 */
+    private String ungModel;
+
+    /** 危包类别 */
+    private String ungClassify;
+
+    /** 危险货物名称 */
+    private String ungGName;
+
+    /** 货物属性代码 */
+    private String productCharCode;
+
+    /** 货号 */
+    private String goodsId;
+
+    /** 用途代码 */
+    private String useTo;
+
+    /** 每项商品需要监管证件 */
+    private String gCertFlag;
+
+    /** 生产单位注册号 */
+    private String mnufctrRegNo;
+
+    /** 危化品目录的CAS号 */
+    private String CAS;
+
+    /** 危险品类型(1、危化品;2、危险货物;3、危化品兼危险货物) */
+    private String goodsType;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+    private int pageIndex;
+    private int pageSize;
+}

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

@@ -0,0 +1,89 @@
+package cn.gov.customs.wxjy.analyze.service;
+
+import java.util.List;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHead;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHeadQuery;
+import com.github.pagehelper.PageInfo;
+
+/**
+ * 危险品报关单头Service接口
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+public interface IEntryHeadService {
+    /**
+     * 查询危险品报关单头
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 危险品报关单头
+     */
+    public EntryHead selectByEntryId(String entryId);
+
+    /**
+     * 分页查询危险品报关单头列表
+     *
+     * @param query
+     * @return 危险品报关单头集合
+     */
+    public PageInfo<EntryHead> selectPageList(EntryHeadQuery query);
+
+    /**
+     * 查询危险品报关单头列表
+     *
+     * @param query
+     * @return 危险品报关单头集合
+     */
+    public List<EntryHead> selectList(EntryHeadQuery query);
+
+    /**
+     * 新增危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    public int insert(EntryHead entryHead);
+
+    /**
+     * 修改危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    public int update(EntryHead entryHead);
+
+    /**
+     * 批量删除危险品报关单头
+     *
+     * @param ids 需要删除的ids主键集合
+     * @return 结果
+     */
+    public int deleteByEntryIds(String[] ids);
+
+    /**
+     * 删除危险品报关单头信息
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    public int deleteByEntryId(String entryId);
+
+    /**
+     * 逻辑删除危险品报关单头信息
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    public int logicDelete(String entryId);
+
+    /**
+     * 导入危险品报关单头数据
+     *
+     * @param entryHeadList 危险品报关单头数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    public String importEntryHead(List<EntryHead> entryHeadList, Boolean isUpdateSupport, CacpTransUser cacpTransUser);
+}

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

@@ -0,0 +1,89 @@
+package cn.gov.customs.wxjy.analyze.service;
+
+import java.util.List;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoods;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoodsQuery;
+import com.github.pagehelper.PageInfo;
+
+/**
+ * 新申报商品提示Service接口
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+public interface INewDeclaredGoodsService {
+    /**
+     * 查询新申报商品提示
+     *
+     * @param ID 新申报商品提示主键
+     * @return 新申报商品提示
+     */
+    public NewDeclaredGoods selectByID(String ID);
+
+    /**
+     * 分页查询新申报商品提示列表
+     *
+     * @param query
+     * @return 新申报商品提示集合
+     */
+    public PageInfo<NewDeclaredGoods> selectPageList(NewDeclaredGoodsQuery query);
+
+    /**
+     * 查询新申报商品提示列表
+     *
+     * @param query
+     * @return 新申报商品提示集合
+     */
+    public List<NewDeclaredGoods> selectList(NewDeclaredGoodsQuery query);
+
+    /**
+     * 新增新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    public int insert(NewDeclaredGoods newDeclaredGoods);
+
+    /**
+     * 修改新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    public int update(NewDeclaredGoods newDeclaredGoods);
+
+    /**
+     * 批量删除新申报商品提示
+     *
+     * @param ids 需要删除的ids主键集合
+     * @return 结果
+     */
+    public int deleteByIDs(String[] ids);
+
+    /**
+     * 删除新申报商品提示信息
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    public int deleteByID(String ID);
+
+    /**
+     * 逻辑删除新申报商品提示信息
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    public int logicDelete(String ID);
+
+    /**
+     * 导入新申报商品提示数据
+     *
+     * @param newDeclaredGoodsList 新申报商品提示数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    public String importNewDeclaredGoods(List<NewDeclaredGoods> newDeclaredGoodsList, Boolean isUpdateSupport, CacpTransUser cacpTransUser);
+}

+ 171 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/impl/EntryHeadServiceImpl.java

@@ -0,0 +1,171 @@
+package cn.gov.customs.wxjy.analyze.service.impl;
+
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.wxjy.common.exception.ServiceException;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import cn.gov.customs.wxjy.common.utils.bean.BeanValidators;
+import cn.gov.customs.wxjy.common.utils.uuid.SnowflakeIdWorker;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.validation.Validator;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import cn.gov.customs.wxjy.common.utils.DateUtils;
+import com.github.pagehelper.PageInfo;
+import cn.gov.customs.wxjy.analyze.dao.EntryHeadMapper;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHead;
+import cn.gov.customs.wxjy.analyze.pojo.EntryHeadQuery;
+import cn.gov.customs.wxjy.analyze.service.IEntryHeadService;
+
+/**
+ * 危险品报关单头Service业务层处理
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class EntryHeadServiceImpl implements IEntryHeadService {
+
+    private final EntryHeadMapper entryHeadMapper;
+
+    private final Validator validator;
+
+    /**
+     * 查询危险品报关单头
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 危险品报关单头
+     */
+    @Override
+    public EntryHead selectByEntryId(String entryId) {
+        return entryHeadMapper.selectByEntryId(entryId);
+    }
+
+    /**
+     * 分页查询危险品报关单头列表
+     *
+     * @param query
+     * @return 危险品报关单头
+     */
+    @Override
+    public PageInfo<EntryHead> selectPageList(EntryHeadQuery query) {
+        return PageInfo.of(entryHeadMapper.selectList(query));
+    }
+
+    /**
+     * 查询危险品报关单头列表
+     *
+     * @param query
+     * @return 危险品报关单头
+     */
+    @Override
+    public List<EntryHead> selectList(EntryHeadQuery query) {
+        return entryHeadMapper.selectList(query);
+    }
+
+    /**
+     * 新增危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    @Override
+    public int insert(EntryHead entryHead) {
+            return entryHeadMapper.insert(entryHead);
+    }
+
+    /**
+     * 修改危险品报关单头
+     *
+     * @param entryHead 危险品报关单头
+     * @return 结果
+     */
+    @Override
+    public int update(EntryHead entryHead) {
+        return entryHeadMapper.update(entryHead);
+    }
+
+    /**
+     * 批量删除危险品报关单头
+     *
+     * @param ids 需要删除的危险品报关单头主键
+     * @return 结果
+     */
+    @Override
+    public int deleteByEntryIds(String[] ids) {
+        return entryHeadMapper.deleteByEntryIds(ids);
+    }
+
+    /**
+     * 删除危险品报关单头信息
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    @Override
+    public int deleteByEntryId(String entryId) {
+        return entryHeadMapper.deleteByEntryId(entryId);
+    }
+
+    /**
+     * 逻辑删除危险品报关单头信息
+     *
+     * @param entryId 危险品报关单头主键
+     * @return 结果
+     */
+    @Override
+    public int logicDelete(String entryId) {
+
+        return entryHeadMapper.logicDelete(entryId);
+    }
+
+    /**
+     * 导入危险品报关单头数据
+     *
+     * @param entryHeadList 危险品报关单头数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    @Override
+    public String importEntryHead(List<EntryHead> entryHeadList, Boolean isUpdateSupport, CacpTransUser cacpTransUser) {
+        if (CollectionUtils.isEmpty(entryHeadList)) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (EntryHead entryHead : entryHeadList) {
+            try {
+
+                BeanValidators.validateWithException(validator, entryHead);
+                //id名称不统一,自行处理
+                entryHead.setCreateTime(DateUtils.getNowDate());
+                entryHead.setUpdateTime(DateUtils.getNowDate());
+                entryHead.setCreateUser(cacpTransUser.getUserId());
+                entryHead.setCreateDept(cacpTransUser.getParentGuid());
+
+                entryHeadMapper.insert(entryHead);
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、 " + cacpTransUser.getUserName() + " 导入成功");
+
+            } catch (Exception e) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、" + cacpTransUser.getUserName() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+}

+ 172 - 0
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/analyze/service/impl/NewDeclaredGoodsServiceImpl.java

@@ -0,0 +1,172 @@
+package cn.gov.customs.wxjy.analyze.service.impl;
+
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.wxjy.common.exception.ServiceException;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import cn.gov.customs.wxjy.common.utils.bean.BeanValidators;
+import cn.gov.customs.wxjy.common.utils.uuid.SnowflakeIdWorker;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.validation.Validator;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import cn.gov.customs.wxjy.common.utils.DateUtils;
+import com.github.pagehelper.PageInfo;
+import cn.gov.customs.wxjy.common.utils.DateUtils;
+import cn.gov.customs.wxjy.analyze.dao.NewDeclaredGoodsMapper;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoods;
+import cn.gov.customs.wxjy.analyze.pojo.NewDeclaredGoodsQuery;
+import cn.gov.customs.wxjy.analyze.service.INewDeclaredGoodsService;
+
+/**
+ * 新申报商品提示Service业务层处理
+ *
+ * @author xiong
+ * @date 2025-12-04
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class NewDeclaredGoodsServiceImpl implements INewDeclaredGoodsService {
+
+    private final NewDeclaredGoodsMapper newDeclaredGoodsMapper;
+
+    private final Validator validator;
+
+    /**
+     * 查询新申报商品提示
+     *
+     * @param ID 新申报商品提示主键
+     * @return 新申报商品提示
+     */
+    @Override
+    public NewDeclaredGoods selectByID(String ID) {
+        return newDeclaredGoodsMapper.selectByID(ID);
+    }
+
+    /**
+     * 分页查询新申报商品提示列表
+     *
+     * @param query
+     * @return 新申报商品提示
+     */
+    @Override
+    public PageInfo<NewDeclaredGoods> selectPageList(NewDeclaredGoodsQuery query) {
+        return PageInfo.of(newDeclaredGoodsMapper.selectList(query));
+    }
+
+    /**
+     * 查询新申报商品提示列表
+     *
+     * @param query
+     * @return 新申报商品提示
+     */
+    @Override
+    public List<NewDeclaredGoods> selectList(NewDeclaredGoodsQuery query) {
+        return newDeclaredGoodsMapper.selectList(query);
+    }
+
+    /**
+     * 新增新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    @Override
+    public int insert(NewDeclaredGoods newDeclaredGoods) {
+            return newDeclaredGoodsMapper.insert(newDeclaredGoods);
+    }
+
+    /**
+     * 修改新申报商品提示
+     *
+     * @param newDeclaredGoods 新申报商品提示
+     * @return 结果
+     */
+    @Override
+    public int update(NewDeclaredGoods newDeclaredGoods) {
+        return newDeclaredGoodsMapper.update(newDeclaredGoods);
+    }
+
+    /**
+     * 批量删除新申报商品提示
+     *
+     * @param ids 需要删除的新申报商品提示主键
+     * @return 结果
+     */
+    @Override
+    public int deleteByIDs(String[] ids) {
+        return newDeclaredGoodsMapper.deleteByIDs(ids);
+    }
+
+    /**
+     * 删除新申报商品提示信息
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    @Override
+    public int deleteByID(String ID) {
+        return newDeclaredGoodsMapper.deleteByID(ID);
+    }
+
+    /**
+     * 逻辑删除新申报商品提示信息
+     *
+     * @param ID 新申报商品提示主键
+     * @return 结果
+     */
+    @Override
+    public int logicDelete(String ID) {
+
+        return newDeclaredGoodsMapper.logicDelete(ID);
+    }
+
+    /**
+     * 导入新申报商品提示数据
+     *
+     * @param newDeclaredGoodsList 新申报商品提示数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    @Override
+    public String importNewDeclaredGoods(List<NewDeclaredGoods> newDeclaredGoodsList, Boolean isUpdateSupport, CacpTransUser cacpTransUser) {
+        if (CollectionUtils.isEmpty(newDeclaredGoodsList)) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (NewDeclaredGoods newDeclaredGoods : newDeclaredGoodsList) {
+            try {
+
+                BeanValidators.validateWithException(validator, newDeclaredGoods);
+                //id名称不统一,自行处理
+                newDeclaredGoods.setCreateTime(DateUtils.getNowDate());
+                newDeclaredGoods.setUpdateTime(DateUtils.getNowDate());
+                newDeclaredGoods.setCreateUser(cacpTransUser.getUserId());
+                newDeclaredGoods.setCreateDept(cacpTransUser.getParentGuid());
+
+                newDeclaredGoodsMapper.insert(newDeclaredGoods);
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、 " + cacpTransUser.getUserName() + " 导入成功");
+
+            } catch (Exception e) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、" + cacpTransUser.getUserName() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+}

+ 1 - 1
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/generator/service/GenTableServiceImpl.java

@@ -378,7 +378,7 @@ public class GenTableServiceImpl implements IGenTableService
         VelocityContext context = VelocityUtils.prepareContext(table);
 
         // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList_xiong(table.getTplCategory(), table.getTplWebType());
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
         for (String template : templates)
         {
             // 渲染模板

+ 35 - 29
wxjy-wxjy-service/src/main/java/cn/gov/customs/wxjy/generator/util/VelocityUtils.java

@@ -136,15 +136,16 @@ public class VelocityUtils
             useWebType = "vm/vue/v3";
         }
         List<String> templates = new ArrayList<String>();
-        templates.add("vm/java/domain.java.vm");
-        templates.add("vm/java/domainQuery.java.vm");
-        templates.add("vm/java/mapper.java.vm");
+        templates.add("vm/java/pojo.java.vm");
+        templates.add("vm/java/pojoQuery.java.vm");
+        templates.add("vm/java/dao.java.vm");
         templates.add("vm/java/service.java.vm");
         templates.add("vm/java/serviceImpl.java.vm");
         templates.add("vm/java/controller.java.vm");
-        templates.add("vm/xml/mapper.xml.vm");
+        templates.add("vm/xml/dao.xml.vm");
         templates.add("vm/sql/sql.vm");
         templates.add("vm/js/api.js.vm");
+        templates.add("vm/type/type.ts.vm");
         if (GenConstants.TPL_CRUD.equals(tplCategory))
         {
             templates.add(useWebType + "/index.vue.vm");
@@ -153,31 +154,32 @@ public class VelocityUtils
         {
             templates.add(useWebType + "/index-tree.vue.vm");
         }
-        else if (GenConstants.TPL_SUB.equals(tplCategory))
-        {
-            templates.add(useWebType + "/index.vue.vm");
-            templates.add("vm/java/sub-domain.java.vm");
-        }
+//        else if (GenConstants.TPL_SUB.equals(tplCategory))
+//        {
+//            templates.add(useWebType + "/index.vue.vm");
+//            templates.add("vm/java/sub-pojo.java.vm");
+//        }
         return templates;
     }
 
-    public static List<String> getTemplateList_xiong(String tplCategory, String tplWebType)
+/*    public static List<String> getTemplateList_xiong(String tplCategory, String tplWebType)
     {
-        String useWebType = "vm-xiong/vue";
+        String useWebType = "vm/vue";
         if ("element-plus".equals(tplWebType))
         {
-            useWebType = "vm-xiong/vue/v3";
+            useWebType = "vm/vue/v3";
         }
         List<String> templates = new ArrayList<String>();
-        templates.add("vm-xiong/java/pojo.java.vm");
-//        templates.add("vm-xiong/java/pojoQuery.java.vm");
-        templates.add("vm-xiong/java/dao.java.vm");
-        templates.add("vm-xiong/java/service.java.vm");
-        templates.add("vm-xiong/java/serviceImpl.java.vm");
-        templates.add("vm-xiong/java/controller.java.vm");
-        templates.add("vm-xiong/xml/dao.xml.vm");
-        templates.add("vm-xiong/sql/sql.vm");
-        templates.add("vm-xiong/js/api.js.vm");
+        templates.add("vm/java/pojo.java.vm");
+        templates.add("vm/java/pojoQuery.java.vm");
+        templates.add("vm/java/dao.java.vm");
+        templates.add("vm/java/service.java.vm");
+        templates.add("vm/java/serviceImpl.java.vm");
+        templates.add("vm/java/controller.java.vm");
+        templates.add("vm/xml/dao.xml.vm");
+        templates.add("vm/sql/sql.vm");
+        templates.add("vm/js/api.js.vm");
+        templates.add("vm/type/type.ts.vm");
         if (GenConstants.TPL_CRUD.equals(tplCategory))
         {
             templates.add(useWebType + "/index.vue.vm");
@@ -189,10 +191,10 @@ public class VelocityUtils
 //        else if (GenConstants.TPL_SUB.equals(tplCategory))
 //        {
 //            templates.add(useWebType + "/index.vue.vm");
-//            templates.add("vm-xiong/java/sub-pojo.java.vm");
+//            templates.add("vm/java/sub-pojo.java.vm");
 //        }
         return templates;
-    }
+    }*/
 
     /**
      * 获取文件名
@@ -218,10 +220,10 @@ public class VelocityUtils
         {
             fileName = StringUtils.format("{}/pojo/{}.java", javaPath, className);
         }
-//        if (template.contains("pojoQuery.java.vm"))
-//        {
-//            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
-//        }
+        if (template.contains("pojoQuery.java.vm"))
+        {
+            fileName = StringUtils.format("{}/pojo/{}Query.java", javaPath, className);
+        }
 //        if (template.contains("sub-pojo.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory()))
 //        {
 //            fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
@@ -252,11 +254,15 @@ public class VelocityUtils
         }
         else if (template.contains("api.js.vm"))
         {
-            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/apis/{}/{}.ts", vuePath, moduleName, businessName);
         }
         else if (template.contains("index.vue.vm"))
         {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/views/{}/{}.vue", vuePath, moduleName,businessName);
+        }
+        else if (template.contains("type.ts.vm"))
+        {
+            fileName = StringUtils.format("{}/types/{}/{}.ts", vuePath, moduleName, businessName);
         }
         else if (template.contains("index-tree.vue.vm"))
         {

+ 667 - 0
wxjy-wxjy-service/src/main/resources/mapper/analyze/EntryHeadMapper.xml

@@ -0,0 +1,667 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.gov.customs.wxjy.analyze.dao.EntryHeadMapper">
+
+    <resultMap type="EntryHead" id="EntryHeadResult">
+        <result property="entryId" column="ENTRY_ID"/>
+        <result property="mainStatus" column="MAIN_STATUS"/>
+        <result property="passMode" column="PASS_MODE"/>
+        <result property="trafMode" column="TRAF_MODE"/>
+        <result property="iEFlag" column="I_E_FLAG"/>
+        <result property="iEPort" column="I_E_PORT"/>
+        <result property="declPort" column="DECL_PORT"/>
+        <result property="iEDate" column="I_E_DATE"/>
+        <result property="declDate" column="DECL_DATE"/>
+        <result property="declAdvanceFlag" column="DECL_ADVANCE_FLAG"/>
+        <result property="acceptDate" column="ACCEPT_DATE"/>
+        <result property="exInPortDate" column="EX_IN_PORT_DATE"/>
+        <result property="consignScc" column="CONSIGN_SCC"/>
+        <result property="consignCode" column="CONSIGN_CODE"/>
+        <result property="consignName" column="CONSIGN_NAME"/>
+        <result property="frnConsignCode" column="FRN_CONSIGN_CODE"/>
+        <result property="frnConsignName" column="FRN_CONSIGN_NAME"/>
+        <result property="tradeMode" column="TRADE_MODE"/>
+        <result property="tradeCountry" column="TRADE_COUNTRY"/>
+        <result property="grossWt" column="GROSS_WT"/>
+        <result property="netWt" column="NET_WT"/>
+        <result property="rmbPrice" column="RMB_PRICE"/>
+        <result property="usdPrice" column="USD_PRICE"/>
+        <result property="CONTAINER" column="CONTAINER"/>
+        <result property="declMode" column="DECL_MODE"/>
+        <result property="declStatus" column="DECL_STATUS"/>
+        <result property="orderReceiveDate" column="ORDER_RECEIVE_DATE"/>
+        <result property="orderReceiveCost" column="ORDER_RECEIVE_COST"/>
+        <result property="certRlsDate" column="CERT_RLS_DATE"/>
+        <result property="preReleaseDate" column="PRE_RELEASE_DATE"/>
+        <result property="agentCode" column="AGENT_CODE"/>
+        <result property="agentName" column="AGENT_NAME"/>
+        <result property="noteS" column="NOTE_S"/>
+        <result property="ownerCode" column="OWNER_CODE"/>
+        <result property="ownerName" column="OWNER_NAME"/>
+        <result property="examDate" column="EXAM_DATE"/>
+        <result property="checkDate" column="CHECK_DATE"/>
+        <result property="compEleDate" column="COMP_ELE_DATE"/>
+        <result property="releaseDate" column="RELEASE_DATE"/>
+        <result property="cuCost" column="CU_COST"/>
+        <result property="totalCost" column="TOTAL_COST"/>
+        <result property="beforeDeclCost" column="BEFORE_DECL_COST"/>
+        <result property="profVerifyFlag" column="PROF_VERIFY_FLAG"/>
+        <result property="newTwoStepFlag" column="NEW_TWO_STEP_FLAG"/>
+        <result property="eleDeclDate" column="ELE_DECL_DATE"/>
+        <result property="assessStartDate" column="ASSESS_START_DATE"/>
+        <result property="assessEndDate" column="ASSESS_END_DATE"/>
+        <result property="refundDate" column="REFUND_DATE"/>
+        <result property="refundFlag" column="REFUND_FLAG"/>
+        <result property="manCreateTime" column="MAN_CREATE_TIME"/>
+        <result property="manChkTimeStart" column="MAN_CHK_TIME_START"/>
+        <result property="manChkTimeEnd" column="MAN_CHK_TIME_END"/>
+        <result property="checkCustomsCode" column="CHECK_CUSTOMS_CODE"/>
+        <result property="checkFlag" column="CHECK_FLAG"/>
+        <result property="manProcResult" column="MAN_PROC_RESULT"/>
+        <result property="manProcIdea" column="MAN_PROC_IDEA"/>
+    </resultMap>
+
+    <sql id="baseVo">
+        select ENTRY_ID, MAIN_STATUS, PASS_MODE, TRAF_MODE, I_E_FLAG, I_E_PORT, DECL_PORT, I_E_DATE, DECL_DATE, DECL_ADVANCE_FLAG, ACCEPT_DATE, EX_IN_PORT_DATE, CONSIGN_SCC, CONSIGN_CODE, CONSIGN_NAME, FRN_CONSIGN_CODE, FRN_CONSIGN_NAME, TRADE_MODE, TRADE_COUNTRY, GROSS_WT, NET_WT, RMB_PRICE, USD_PRICE, CONTAINER, DECL_MODE, DECL_STATUS, ORDER_RECEIVE_DATE, ORDER_RECEIVE_COST, CERT_RLS_DATE, PRE_RELEASE_DATE, AGENT_CODE, AGENT_NAME, NOTE_S, OWNER_CODE, OWNER_NAME, EXAM_DATE, CHECK_DATE, COMP_ELE_DATE, RELEASE_DATE, CU_COST, TOTAL_COST, BEFORE_DECL_COST, PROF_VERIFY_FLAG, NEW_TWO_STEP_FLAG, ELE_DECL_DATE, ASSESS_START_DATE, ASSESS_END_DATE, REFUND_DATE, REFUND_FLAG, MAN_CREATE_TIME, MAN_CHK_TIME_START, MAN_CHK_TIME_END, CHECK_CUSTOMS_CODE, CHECK_FLAG, MAN_PROC_RESULT, MAN_PROC_IDEA
+        from WXJY_ENTRY_HEAD
+    </sql>
+
+    <select id="selectList" parameterType="EntryHeadQuery" resultMap="EntryHeadResult">
+        <include refid="baseVo"/>
+        <where>
+        <if test="mainStatus != null  and mainStatus != ''">
+            and MAIN_STATUS = #{mainStatus}
+        </if>
+        <if test="passMode != null  and passMode != ''">
+            and PASS_MODE = #{passMode}
+        </if>
+        <if test="trafMode != null  and trafMode != ''">
+            and TRAF_MODE = #{trafMode}
+        </if>
+        <if test="iEFlag != null  and iEFlag != ''">
+            and I_E_FLAG = #{iEFlag}
+        </if>
+        <if test="iEPort != null  and iEPort != ''">
+            and I_E_PORT = #{iEPort}
+        </if>
+        <if test="declPort != null  and declPort != ''">
+            and DECL_PORT = #{declPort}
+        </if>
+        <if test="iEDate != null  and iEDate != ''">
+            and I_E_DATE = #{iEDate}
+        </if>
+        <if test="declDate != null  and declDate != ''">
+            and DECL_DATE = #{declDate}
+        </if>
+        <if test="declAdvanceFlag != null  and declAdvanceFlag != ''">
+            and DECL_ADVANCE_FLAG = #{declAdvanceFlag}
+        </if>
+        <if test="acceptDate != null  and acceptDate != ''">
+            and ACCEPT_DATE = #{acceptDate}
+        </if>
+        <if test="exInPortDate != null  and exInPortDate != ''">
+            and EX_IN_PORT_DATE = #{exInPortDate}
+        </if>
+        <if test="consignScc != null  and consignScc != ''">
+            and CONSIGN_SCC = #{consignScc}
+        </if>
+        <if test="consignCode != null  and consignCode != ''">
+            and CONSIGN_CODE = #{consignCode}
+        </if>
+        <if test="consignName != null  and consignName != ''">
+            and CONSIGN_NAME like concat('%', #{consignName}, '%')
+        </if>
+        <if test="frnConsignCode != null  and frnConsignCode != ''">
+            and FRN_CONSIGN_CODE = #{frnConsignCode}
+        </if>
+        <if test="frnConsignName != null  and frnConsignName != ''">
+            and FRN_CONSIGN_NAME like concat('%', #{frnConsignName}, '%')
+        </if>
+        <if test="tradeMode != null  and tradeMode != ''">
+            and TRADE_MODE = #{tradeMode}
+        </if>
+        <if test="tradeCountry != null  and tradeCountry != ''">
+            and TRADE_COUNTRY = #{tradeCountry}
+        </if>
+        <if test="grossWt != null  and grossWt != ''">
+            and GROSS_WT = #{grossWt}
+        </if>
+        <if test="netWt != null  and netWt != ''">
+            and NET_WT = #{netWt}
+        </if>
+        <if test="rmbPrice != null  and rmbPrice != ''">
+            and RMB_PRICE = #{rmbPrice}
+        </if>
+        <if test="usdPrice != null  and usdPrice != ''">
+            and USD_PRICE = #{usdPrice}
+        </if>
+        <if test="CONTAINER != null  and CONTAINER != ''">
+            and CONTAINER = #{CONTAINER}
+        </if>
+        <if test="declMode != null  and declMode != ''">
+            and DECL_MODE = #{declMode}
+        </if>
+        <if test="declStatus != null  and declStatus != ''">
+            and DECL_STATUS = #{declStatus}
+        </if>
+        <if test="orderReceiveDate != null  and orderReceiveDate != ''">
+            and ORDER_RECEIVE_DATE = #{orderReceiveDate}
+        </if>
+        <if test="orderReceiveCost != null  and orderReceiveCost != ''">
+            and ORDER_RECEIVE_COST = #{orderReceiveCost}
+        </if>
+        <if test="certRlsDate != null  and certRlsDate != ''">
+            and CERT_RLS_DATE = #{certRlsDate}
+        </if>
+        <if test="preReleaseDate != null  and preReleaseDate != ''">
+            and PRE_RELEASE_DATE = #{preReleaseDate}
+        </if>
+        <if test="agentCode != null  and agentCode != ''">
+            and AGENT_CODE = #{agentCode}
+        </if>
+        <if test="agentName != null  and agentName != ''">
+            and AGENT_NAME like concat('%', #{agentName}, '%')
+        </if>
+        <if test="noteS != null  and noteS != ''">
+            and NOTE_S = #{noteS}
+        </if>
+        <if test="ownerCode != null  and ownerCode != ''">
+            and OWNER_CODE = #{ownerCode}
+        </if>
+        <if test="ownerName != null  and ownerName != ''">
+            and OWNER_NAME like concat('%', #{ownerName}, '%')
+        </if>
+        <if test="examDate != null  and examDate != ''">
+            and EXAM_DATE = #{examDate}
+        </if>
+        <if test="checkDate != null  and checkDate != ''">
+            and CHECK_DATE = #{checkDate}
+        </if>
+        <if test="compEleDate != null  and compEleDate != ''">
+            and COMP_ELE_DATE = #{compEleDate}
+        </if>
+        <if test="releaseDate != null  and releaseDate != ''">
+            and RELEASE_DATE = #{releaseDate}
+        </if>
+        <if test="cuCost != null  and cuCost != ''">
+            and CU_COST = #{cuCost}
+        </if>
+        <if test="totalCost != null  and totalCost != ''">
+            and TOTAL_COST = #{totalCost}
+        </if>
+        <if test="beforeDeclCost != null  and beforeDeclCost != ''">
+            and BEFORE_DECL_COST = #{beforeDeclCost}
+        </if>
+        <if test="profVerifyFlag != null  and profVerifyFlag != ''">
+            and PROF_VERIFY_FLAG = #{profVerifyFlag}
+        </if>
+        <if test="newTwoStepFlag != null  and newTwoStepFlag != ''">
+            and NEW_TWO_STEP_FLAG = #{newTwoStepFlag}
+        </if>
+        <if test="eleDeclDate != null  and eleDeclDate != ''">
+            and ELE_DECL_DATE = #{eleDeclDate}
+        </if>
+        <if test="assessStartDate != null  and assessStartDate != ''">
+            and ASSESS_START_DATE = #{assessStartDate}
+        </if>
+        <if test="assessEndDate != null  and assessEndDate != ''">
+            and ASSESS_END_DATE = #{assessEndDate}
+        </if>
+        <if test="refundDate != null  and refundDate != ''">
+            and REFUND_DATE = #{refundDate}
+        </if>
+        <if test="refundFlag != null  and refundFlag != ''">
+            and REFUND_FLAG = #{refundFlag}
+        </if>
+        <if test="manCreateTime != null  and manCreateTime != ''">
+            and MAN_CREATE_TIME = #{manCreateTime}
+        </if>
+        <if test="manChkTimeStart != null  and manChkTimeStart != ''">
+            and MAN_CHK_TIME_START = #{manChkTimeStart}
+        </if>
+        <if test="manChkTimeEnd != null  and manChkTimeEnd != ''">
+            and MAN_CHK_TIME_END = #{manChkTimeEnd}
+        </if>
+        <if test="checkCustomsCode != null  and checkCustomsCode != ''">
+            and CHECK_CUSTOMS_CODE = #{checkCustomsCode}
+        </if>
+        <if test="checkFlag != null  and checkFlag != ''">
+            and CHECK_FLAG = #{checkFlag}
+        </if>
+        <if test="manProcResult != null  and manProcResult != ''">
+            and MAN_PROC_RESULT = #{manProcResult}
+        </if>
+        <if test="manProcIdea != null  and manProcIdea != ''">
+            and MAN_PROC_IDEA = #{manProcIdea}
+        </if>
+        </where>
+    </select>
+
+    <select id="selectByEntryId" parameterType="String"
+        resultMap="EntryHeadResult">
+        <include refid="baseVo"/>
+        where ENTRY_ID = #{entryId}
+    </select>
+
+    <insert id="insert" parameterType="EntryHead">
+        insert into WXJY_ENTRY_HEAD
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="entryId != null and entryId != ''">ENTRY_ID,
+            </if>
+            <if test="mainStatus != null">MAIN_STATUS,
+            </if>
+            <if test="passMode != null">PASS_MODE,
+            </if>
+            <if test="trafMode != null">TRAF_MODE,
+            </if>
+            <if test="iEFlag != null">I_E_FLAG,
+            </if>
+            <if test="iEPort != null">I_E_PORT,
+            </if>
+            <if test="declPort != null">DECL_PORT,
+            </if>
+            <if test="iEDate != null">I_E_DATE,
+            </if>
+            <if test="declDate != null">DECL_DATE,
+            </if>
+            <if test="declAdvanceFlag != null">DECL_ADVANCE_FLAG,
+            </if>
+            <if test="acceptDate != null">ACCEPT_DATE,
+            </if>
+            <if test="exInPortDate != null">EX_IN_PORT_DATE,
+            </if>
+            <if test="consignScc != null">CONSIGN_SCC,
+            </if>
+            <if test="consignCode != null">CONSIGN_CODE,
+            </if>
+            <if test="consignName != null">CONSIGN_NAME,
+            </if>
+            <if test="frnConsignCode != null">FRN_CONSIGN_CODE,
+            </if>
+            <if test="frnConsignName != null">FRN_CONSIGN_NAME,
+            </if>
+            <if test="tradeMode != null">TRADE_MODE,
+            </if>
+            <if test="tradeCountry != null">TRADE_COUNTRY,
+            </if>
+            <if test="grossWt != null">GROSS_WT,
+            </if>
+            <if test="netWt != null">NET_WT,
+            </if>
+            <if test="rmbPrice != null">RMB_PRICE,
+            </if>
+            <if test="usdPrice != null">USD_PRICE,
+            </if>
+            <if test="CONTAINER != null">CONTAINER,
+            </if>
+            <if test="declMode != null">DECL_MODE,
+            </if>
+            <if test="declStatus != null">DECL_STATUS,
+            </if>
+            <if test="orderReceiveDate != null">ORDER_RECEIVE_DATE,
+            </if>
+            <if test="orderReceiveCost != null">ORDER_RECEIVE_COST,
+            </if>
+            <if test="certRlsDate != null">CERT_RLS_DATE,
+            </if>
+            <if test="preReleaseDate != null">PRE_RELEASE_DATE,
+            </if>
+            <if test="agentCode != null">AGENT_CODE,
+            </if>
+            <if test="agentName != null">AGENT_NAME,
+            </if>
+            <if test="noteS != null">NOTE_S,
+            </if>
+            <if test="ownerCode != null">OWNER_CODE,
+            </if>
+            <if test="ownerName != null">OWNER_NAME,
+            </if>
+            <if test="examDate != null">EXAM_DATE,
+            </if>
+            <if test="checkDate != null">CHECK_DATE,
+            </if>
+            <if test="compEleDate != null">COMP_ELE_DATE,
+            </if>
+            <if test="releaseDate != null">RELEASE_DATE,
+            </if>
+            <if test="cuCost != null">CU_COST,
+            </if>
+            <if test="totalCost != null">TOTAL_COST,
+            </if>
+            <if test="beforeDeclCost != null">BEFORE_DECL_COST,
+            </if>
+            <if test="profVerifyFlag != null">PROF_VERIFY_FLAG,
+            </if>
+            <if test="newTwoStepFlag != null">NEW_TWO_STEP_FLAG,
+            </if>
+            <if test="eleDeclDate != null">ELE_DECL_DATE,
+            </if>
+            <if test="assessStartDate != null">ASSESS_START_DATE,
+            </if>
+            <if test="assessEndDate != null">ASSESS_END_DATE,
+            </if>
+            <if test="refundDate != null">REFUND_DATE,
+            </if>
+            <if test="refundFlag != null">REFUND_FLAG,
+            </if>
+            <if test="manCreateTime != null">MAN_CREATE_TIME,
+            </if>
+            <if test="manChkTimeStart != null">MAN_CHK_TIME_START,
+            </if>
+            <if test="manChkTimeEnd != null">MAN_CHK_TIME_END,
+            </if>
+            <if test="checkCustomsCode != null">CHECK_CUSTOMS_CODE,
+            </if>
+            <if test="checkFlag != null">CHECK_FLAG,
+            </if>
+            <if test="manProcResult != null">MAN_PROC_RESULT,
+            </if>
+            <if test="manProcIdea != null">MAN_PROC_IDEA,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="entryId != null and entryId != ''">#{entryId},
+            </if>
+            <if test="mainStatus != null">#{mainStatus},
+            </if>
+            <if test="passMode != null">#{passMode},
+            </if>
+            <if test="trafMode != null">#{trafMode},
+            </if>
+            <if test="iEFlag != null">#{iEFlag},
+            </if>
+            <if test="iEPort != null">#{iEPort},
+            </if>
+            <if test="declPort != null">#{declPort},
+            </if>
+            <if test="iEDate != null">#{iEDate},
+            </if>
+            <if test="declDate != null">#{declDate},
+            </if>
+            <if test="declAdvanceFlag != null">#{declAdvanceFlag},
+            </if>
+            <if test="acceptDate != null">#{acceptDate},
+            </if>
+            <if test="exInPortDate != null">#{exInPortDate},
+            </if>
+            <if test="consignScc != null">#{consignScc},
+            </if>
+            <if test="consignCode != null">#{consignCode},
+            </if>
+            <if test="consignName != null">#{consignName},
+            </if>
+            <if test="frnConsignCode != null">#{frnConsignCode},
+            </if>
+            <if test="frnConsignName != null">#{frnConsignName},
+            </if>
+            <if test="tradeMode != null">#{tradeMode},
+            </if>
+            <if test="tradeCountry != null">#{tradeCountry},
+            </if>
+            <if test="grossWt != null">#{grossWt},
+            </if>
+            <if test="netWt != null">#{netWt},
+            </if>
+            <if test="rmbPrice != null">#{rmbPrice},
+            </if>
+            <if test="usdPrice != null">#{usdPrice},
+            </if>
+            <if test="CONTAINER != null">#{CONTAINER},
+            </if>
+            <if test="declMode != null">#{declMode},
+            </if>
+            <if test="declStatus != null">#{declStatus},
+            </if>
+            <if test="orderReceiveDate != null">#{orderReceiveDate},
+            </if>
+            <if test="orderReceiveCost != null">#{orderReceiveCost},
+            </if>
+            <if test="certRlsDate != null">#{certRlsDate},
+            </if>
+            <if test="preReleaseDate != null">#{preReleaseDate},
+            </if>
+            <if test="agentCode != null">#{agentCode},
+            </if>
+            <if test="agentName != null">#{agentName},
+            </if>
+            <if test="noteS != null">#{noteS},
+            </if>
+            <if test="ownerCode != null">#{ownerCode},
+            </if>
+            <if test="ownerName != null">#{ownerName},
+            </if>
+            <if test="examDate != null">#{examDate},
+            </if>
+            <if test="checkDate != null">#{checkDate},
+            </if>
+            <if test="compEleDate != null">#{compEleDate},
+            </if>
+            <if test="releaseDate != null">#{releaseDate},
+            </if>
+            <if test="cuCost != null">#{cuCost},
+            </if>
+            <if test="totalCost != null">#{totalCost},
+            </if>
+            <if test="beforeDeclCost != null">#{beforeDeclCost},
+            </if>
+            <if test="profVerifyFlag != null">#{profVerifyFlag},
+            </if>
+            <if test="newTwoStepFlag != null">#{newTwoStepFlag},
+            </if>
+            <if test="eleDeclDate != null">#{eleDeclDate},
+            </if>
+            <if test="assessStartDate != null">#{assessStartDate},
+            </if>
+            <if test="assessEndDate != null">#{assessEndDate},
+            </if>
+            <if test="refundDate != null">#{refundDate},
+            </if>
+            <if test="refundFlag != null">#{refundFlag},
+            </if>
+            <if test="manCreateTime != null">#{manCreateTime},
+            </if>
+            <if test="manChkTimeStart != null">#{manChkTimeStart},
+            </if>
+            <if test="manChkTimeEnd != null">#{manChkTimeEnd},
+            </if>
+            <if test="checkCustomsCode != null">#{checkCustomsCode},
+            </if>
+            <if test="checkFlag != null">#{checkFlag},
+            </if>
+            <if test="manProcResult != null">#{manProcResult},
+            </if>
+            <if test="manProcIdea != null">#{manProcIdea},
+            </if>
+        </trim>
+    </insert>
+
+    <update id="update" parameterType="EntryHead">
+        update WXJY_ENTRY_HEAD
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="mainStatus != null">MAIN_STATUS =
+                #{mainStatus},
+            </if>
+            <if test="passMode != null">PASS_MODE =
+                #{passMode},
+            </if>
+            <if test="trafMode != null">TRAF_MODE =
+                #{trafMode},
+            </if>
+            <if test="iEFlag != null">I_E_FLAG =
+                #{iEFlag},
+            </if>
+            <if test="iEPort != null">I_E_PORT =
+                #{iEPort},
+            </if>
+            <if test="declPort != null">DECL_PORT =
+                #{declPort},
+            </if>
+            <if test="iEDate != null">I_E_DATE =
+                #{iEDate},
+            </if>
+            <if test="declDate != null">DECL_DATE =
+                #{declDate},
+            </if>
+            <if test="declAdvanceFlag != null">DECL_ADVANCE_FLAG =
+                #{declAdvanceFlag},
+            </if>
+            <if test="acceptDate != null">ACCEPT_DATE =
+                #{acceptDate},
+            </if>
+            <if test="exInPortDate != null">EX_IN_PORT_DATE =
+                #{exInPortDate},
+            </if>
+            <if test="consignScc != null">CONSIGN_SCC =
+                #{consignScc},
+            </if>
+            <if test="consignCode != null">CONSIGN_CODE =
+                #{consignCode},
+            </if>
+            <if test="consignName != null">CONSIGN_NAME =
+                #{consignName},
+            </if>
+            <if test="frnConsignCode != null">FRN_CONSIGN_CODE =
+                #{frnConsignCode},
+            </if>
+            <if test="frnConsignName != null">FRN_CONSIGN_NAME =
+                #{frnConsignName},
+            </if>
+            <if test="tradeMode != null">TRADE_MODE =
+                #{tradeMode},
+            </if>
+            <if test="tradeCountry != null">TRADE_COUNTRY =
+                #{tradeCountry},
+            </if>
+            <if test="grossWt != null">GROSS_WT =
+                #{grossWt},
+            </if>
+            <if test="netWt != null">NET_WT =
+                #{netWt},
+            </if>
+            <if test="rmbPrice != null">RMB_PRICE =
+                #{rmbPrice},
+            </if>
+            <if test="usdPrice != null">USD_PRICE =
+                #{usdPrice},
+            </if>
+            <if test="CONTAINER != null">CONTAINER =
+                #{CONTAINER},
+            </if>
+            <if test="declMode != null">DECL_MODE =
+                #{declMode},
+            </if>
+            <if test="declStatus != null">DECL_STATUS =
+                #{declStatus},
+            </if>
+            <if test="orderReceiveDate != null">ORDER_RECEIVE_DATE =
+                #{orderReceiveDate},
+            </if>
+            <if test="orderReceiveCost != null">ORDER_RECEIVE_COST =
+                #{orderReceiveCost},
+            </if>
+            <if test="certRlsDate != null">CERT_RLS_DATE =
+                #{certRlsDate},
+            </if>
+            <if test="preReleaseDate != null">PRE_RELEASE_DATE =
+                #{preReleaseDate},
+            </if>
+            <if test="agentCode != null">AGENT_CODE =
+                #{agentCode},
+            </if>
+            <if test="agentName != null">AGENT_NAME =
+                #{agentName},
+            </if>
+            <if test="noteS != null">NOTE_S =
+                #{noteS},
+            </if>
+            <if test="ownerCode != null">OWNER_CODE =
+                #{ownerCode},
+            </if>
+            <if test="ownerName != null">OWNER_NAME =
+                #{ownerName},
+            </if>
+            <if test="examDate != null">EXAM_DATE =
+                #{examDate},
+            </if>
+            <if test="checkDate != null">CHECK_DATE =
+                #{checkDate},
+            </if>
+            <if test="compEleDate != null">COMP_ELE_DATE =
+                #{compEleDate},
+            </if>
+            <if test="releaseDate != null">RELEASE_DATE =
+                #{releaseDate},
+            </if>
+            <if test="cuCost != null">CU_COST =
+                #{cuCost},
+            </if>
+            <if test="totalCost != null">TOTAL_COST =
+                #{totalCost},
+            </if>
+            <if test="beforeDeclCost != null">BEFORE_DECL_COST =
+                #{beforeDeclCost},
+            </if>
+            <if test="profVerifyFlag != null">PROF_VERIFY_FLAG =
+                #{profVerifyFlag},
+            </if>
+            <if test="newTwoStepFlag != null">NEW_TWO_STEP_FLAG =
+                #{newTwoStepFlag},
+            </if>
+            <if test="eleDeclDate != null">ELE_DECL_DATE =
+                #{eleDeclDate},
+            </if>
+            <if test="assessStartDate != null">ASSESS_START_DATE =
+                #{assessStartDate},
+            </if>
+            <if test="assessEndDate != null">ASSESS_END_DATE =
+                #{assessEndDate},
+            </if>
+            <if test="refundDate != null">REFUND_DATE =
+                #{refundDate},
+            </if>
+            <if test="refundFlag != null">REFUND_FLAG =
+                #{refundFlag},
+            </if>
+            <if test="manCreateTime != null">MAN_CREATE_TIME =
+                #{manCreateTime},
+            </if>
+            <if test="manChkTimeStart != null">MAN_CHK_TIME_START =
+                #{manChkTimeStart},
+            </if>
+            <if test="manChkTimeEnd != null">MAN_CHK_TIME_END =
+                #{manChkTimeEnd},
+            </if>
+            <if test="checkCustomsCode != null">CHECK_CUSTOMS_CODE =
+                #{checkCustomsCode},
+            </if>
+            <if test="checkFlag != null">CHECK_FLAG =
+                #{checkFlag},
+            </if>
+            <if test="manProcResult != null">MAN_PROC_RESULT =
+                #{manProcResult},
+            </if>
+            <if test="manProcIdea != null">MAN_PROC_IDEA =
+                #{manProcIdea},
+            </if>
+        </trim>
+        where ENTRY_ID = #{entryId}
+    </update>
+
+    <delete id="deleteByEntryId" parameterType="String">
+        delete
+        from WXJY_ENTRY_HEAD where ENTRY_ID = #{entryId}
+    </delete>
+
+    <delete id="deleteByEntryIds" parameterType="String">
+        delete from WXJY_ENTRY_HEAD where ENTRY_ID in
+        <foreach item="entryId" collection="array" open="(" separator="," close=")">
+            #{entryId}
+        </foreach>
+    </delete>
+
+    <delete id="logicDelete" parameterType="String">
+        update  WXJY_ENTRY_HEAD set is_del = 1  where ENTRY_ID = #{entryId}
+    </delete>
+</mapper>

+ 700 - 0
wxjy-wxjy-service/src/main/resources/mapper/analyze/NewDeclaredGoodsMapper.xml

@@ -0,0 +1,700 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.gov.customs.wxjy.analyze.dao.NewDeclaredGoodsMapper">
+
+    <resultMap type="NewDeclaredGoods" id="NewDeclaredGoodsResult">
+        <result property="ID" column="ID"/>
+        <result property="entryId" column="ENTRY_ID"/>
+        <result property="gNo" column="G_NO"/>
+        <result property="ieFlag" column="IE_FLAG"/>
+        <result property="iePort" column="IE_PORT"/>
+        <result property="declPort" column="DECL_PORT"/>
+        <result property="customsCode" column="CUSTOMS_CODE"/>
+        <result property="declDate" column="DECL_DATE"/>
+        <result property="consignScc" column="CONSIGN_SCC"/>
+        <result property="consignCode" column="CONSIGN_CODE"/>
+        <result property="consignName" column="CONSIGN_NAME"/>
+        <result property="codeTs" column="CODE_TS"/>
+        <result property="iqCode" column="IQ_CODE"/>
+        <result property="gName" column="G_NAME"/>
+        <result property="iqGName" column="IQ_G_NAME"/>
+        <result property="gNameFn" column="G_NAME_FN"/>
+        <result property="gModel" column="G_MODEL"/>
+        <result property="iqGModel" column="IQ_G_MODEL"/>
+        <result property="gComposition" column="G_COMPOSITION"/>
+        <result property="prodWarranty" column="PROD_WARRANTY"/>
+        <result property="prodValidaty" column="PROD_VALIDATY"/>
+        <result property="dutyMode" column="DUTY_MODE"/>
+        <result property="GTIN" column="GTIN"/>
+        <result property="gQty" column="G_QTY"/>
+        <result property="gUnit" column="G_UNIT"/>
+        <result property="qty1" column="QTY_1"/>
+        <result property="unit1" column="UNIT_1"/>
+        <result property="qty2" column="QTY_2"/>
+        <result property="unit2" column="UNIT_2"/>
+        <result property="declPrice" column="DECL_PRICE"/>
+        <result property="declTotal" column="DECL_TOTAL"/>
+        <result property="tradeCurr" column="TRADE_CURR"/>
+        <result property="tradeTotal" column="TRADE_TOTAL"/>
+        <result property="dutyValue" column="DUTY_VALUE"/>
+        <result property="rmbPrice" column="RMB_PRICE"/>
+        <result property="usdPrice" column="USD_PRICE"/>
+        <result property="exchangeRate" column="EXCHANGE_RATE"/>
+        <result property="originCountry" column="ORIGIN_COUNTRY"/>
+        <result property="originRegionCode" column="ORIGIN_REGION_CODE"/>
+        <result property="destCountry" column="DEST_COUNTRY"/>
+        <result property="ieDistrictCode" column="IE_DISTRICT_CODE"/>
+        <result property="iqIeDistrictCode" column="IQ_IE_DISTRICT_CODE"/>
+        <result property="frnProducerName" column="FRN_PRODUCER_NAME"/>
+        <result property="productModel" column="PRODUCT_MODEL"/>
+        <result property="productBrand" column="PRODUCT_BRAND"/>
+        <result property="productDate" column="PRODUCT_DATE"/>
+        <result property="productBatch" column="PRODUCT_BATCH"/>
+        <result property="UNGID" column="UNGID"/>
+        <result property="ungFlag" column="UNG_FLAG"/>
+        <result property="ungModel" column="UNG_MODEL"/>
+        <result property="ungClassify" column="UNG_CLASSIFY"/>
+        <result property="ungGName" column="UNG_G_NAME"/>
+        <result property="productCharCode" column="PRODUCT_CHAR_CODE"/>
+        <result property="goodsId" column="GOODS_ID"/>
+        <result property="useTo" column="USE_TO"/>
+        <result property="gCertFlag" column="G_CERT_FLAG"/>
+        <result property="mnufctrRegNo" column="MNUFCTR_REG_NO"/>
+        <result property="CAS" column="CAS"/>
+        <result property="goodsType" column="GOODS_TYPE"/>
+    </resultMap>
+
+    <sql id="baseVo">
+        select ID, ENTRY_ID, G_NO, IE_FLAG, IE_PORT, DECL_PORT, CUSTOMS_CODE, DECL_DATE, CONSIGN_SCC, CONSIGN_CODE, CONSIGN_NAME, CODE_TS, IQ_CODE, G_NAME, IQ_G_NAME, G_NAME_FN, G_MODEL, IQ_G_MODEL, G_COMPOSITION, PROD_WARRANTY, PROD_VALIDATY, DUTY_MODE, GTIN, G_QTY, G_UNIT, QTY_1, UNIT_1, QTY_2, UNIT_2, DECL_PRICE, DECL_TOTAL, TRADE_CURR, TRADE_TOTAL, DUTY_VALUE, RMB_PRICE, USD_PRICE, EXCHANGE_RATE, ORIGIN_COUNTRY, ORIGIN_REGION_CODE, DEST_COUNTRY, IE_DISTRICT_CODE, IQ_IE_DISTRICT_CODE, FRN_PRODUCER_NAME, PRODUCT_MODEL, PRODUCT_BRAND, PRODUCT_DATE, PRODUCT_BATCH, UNGID, UNG_FLAG, UNG_MODEL, UNG_CLASSIFY, UNG_G_NAME, PRODUCT_CHAR_CODE, GOODS_ID, USE_TO, G_CERT_FLAG, MNUFCTR_REG_NO, CAS, GOODS_TYPE
+        from WXJY_NEW_DECLARED_GOODS
+    </sql>
+
+    <select id="selectList" parameterType="NewDeclaredGoodsQuery" resultMap="NewDeclaredGoodsResult">
+        <include refid="baseVo"/>
+        <where>
+        <if test="entryId != null  and entryId != ''">
+            and ENTRY_ID = #{entryId}
+        </if>
+        <if test="gNo != null  and gNo != ''">
+            and G_NO = #{gNo}
+        </if>
+        <if test="ieFlag != null  and ieFlag != ''">
+            and IE_FLAG = #{ieFlag}
+        </if>
+        <if test="iePort != null  and iePort != ''">
+            and IE_PORT = #{iePort}
+        </if>
+        <if test="declPort != null  and declPort != ''">
+            and DECL_PORT = #{declPort}
+        </if>
+        <if test="customsCode != null  and customsCode != ''">
+            and CUSTOMS_CODE = #{customsCode}
+        </if>
+        <if test="declDate != null  and declDate != ''">
+            and DECL_DATE = #{declDate}
+        </if>
+        <if test="consignScc != null  and consignScc != ''">
+            and CONSIGN_SCC = #{consignScc}
+        </if>
+        <if test="consignCode != null  and consignCode != ''">
+            and CONSIGN_CODE = #{consignCode}
+        </if>
+        <if test="consignName != null  and consignName != ''">
+            and CONSIGN_NAME like concat('%', #{consignName}, '%')
+        </if>
+        <if test="codeTs != null  and codeTs != ''">
+            and CODE_TS = #{codeTs}
+        </if>
+        <if test="iqCode != null  and iqCode != ''">
+            and IQ_CODE = #{iqCode}
+        </if>
+        <if test="gName != null  and gName != ''">
+            and G_NAME like concat('%', #{gName}, '%')
+        </if>
+        <if test="iqGName != null  and iqGName != ''">
+            and IQ_G_NAME like concat('%', #{iqGName}, '%')
+        </if>
+        <if test="gNameFn != null  and gNameFn != ''">
+            and G_NAME_FN = #{gNameFn}
+        </if>
+        <if test="gModel != null  and gModel != ''">
+            and G_MODEL = #{gModel}
+        </if>
+        <if test="iqGModel != null  and iqGModel != ''">
+            and IQ_G_MODEL = #{iqGModel}
+        </if>
+        <if test="gComposition != null  and gComposition != ''">
+            and G_COMPOSITION = #{gComposition}
+        </if>
+        <if test="prodWarranty != null  and prodWarranty != ''">
+            and PROD_WARRANTY = #{prodWarranty}
+        </if>
+        <if test="prodValidaty != null  and prodValidaty != ''">
+            and PROD_VALIDATY = #{prodValidaty}
+        </if>
+        <if test="dutyMode != null  and dutyMode != ''">
+            and DUTY_MODE = #{dutyMode}
+        </if>
+        <if test="GTIN != null  and GTIN != ''">
+            and GTIN = #{GTIN}
+        </if>
+        <if test="gQty != null  and gQty != ''">
+            and G_QTY = #{gQty}
+        </if>
+        <if test="gUnit != null  and gUnit != ''">
+            and G_UNIT = #{gUnit}
+        </if>
+        <if test="qty1 != null  and qty1 != ''">
+            and QTY_1 = #{qty1}
+        </if>
+        <if test="unit1 != null  and unit1 != ''">
+            and UNIT_1 = #{unit1}
+        </if>
+        <if test="qty2 != null  and qty2 != ''">
+            and QTY_2 = #{qty2}
+        </if>
+        <if test="unit2 != null  and unit2 != ''">
+            and UNIT_2 = #{unit2}
+        </if>
+        <if test="declPrice != null  and declPrice != ''">
+            and DECL_PRICE = #{declPrice}
+        </if>
+        <if test="declTotal != null  and declTotal != ''">
+            and DECL_TOTAL = #{declTotal}
+        </if>
+        <if test="tradeCurr != null  and tradeCurr != ''">
+            and TRADE_CURR = #{tradeCurr}
+        </if>
+        <if test="tradeTotal != null  and tradeTotal != ''">
+            and TRADE_TOTAL = #{tradeTotal}
+        </if>
+        <if test="dutyValue != null  and dutyValue != ''">
+            and DUTY_VALUE = #{dutyValue}
+        </if>
+        <if test="rmbPrice != null  and rmbPrice != ''">
+            and RMB_PRICE = #{rmbPrice}
+        </if>
+        <if test="usdPrice != null  and usdPrice != ''">
+            and USD_PRICE = #{usdPrice}
+        </if>
+        <if test="exchangeRate != null  and exchangeRate != ''">
+            and EXCHANGE_RATE = #{exchangeRate}
+        </if>
+        <if test="originCountry != null  and originCountry != ''">
+            and ORIGIN_COUNTRY = #{originCountry}
+        </if>
+        <if test="originRegionCode != null  and originRegionCode != ''">
+            and ORIGIN_REGION_CODE = #{originRegionCode}
+        </if>
+        <if test="destCountry != null  and destCountry != ''">
+            and DEST_COUNTRY = #{destCountry}
+        </if>
+        <if test="ieDistrictCode != null  and ieDistrictCode != ''">
+            and IE_DISTRICT_CODE = #{ieDistrictCode}
+        </if>
+        <if test="iqIeDistrictCode != null  and iqIeDistrictCode != ''">
+            and IQ_IE_DISTRICT_CODE = #{iqIeDistrictCode}
+        </if>
+        <if test="frnProducerName != null  and frnProducerName != ''">
+            and FRN_PRODUCER_NAME like concat('%', #{frnProducerName}, '%')
+        </if>
+        <if test="productModel != null  and productModel != ''">
+            and PRODUCT_MODEL = #{productModel}
+        </if>
+        <if test="productBrand != null  and productBrand != ''">
+            and PRODUCT_BRAND = #{productBrand}
+        </if>
+        <if test="productDate != null  and productDate != ''">
+            and PRODUCT_DATE = #{productDate}
+        </if>
+        <if test="productBatch != null  and productBatch != ''">
+            and PRODUCT_BATCH = #{productBatch}
+        </if>
+        <if test="UNGID != null  and UNGID != ''">
+            and UNGID = #{UNGID}
+        </if>
+        <if test="ungFlag != null  and ungFlag != ''">
+            and UNG_FLAG = #{ungFlag}
+        </if>
+        <if test="ungModel != null  and ungModel != ''">
+            and UNG_MODEL = #{ungModel}
+        </if>
+        <if test="ungClassify != null  and ungClassify != ''">
+            and UNG_CLASSIFY = #{ungClassify}
+        </if>
+        <if test="ungGName != null  and ungGName != ''">
+            and UNG_G_NAME like concat('%', #{ungGName}, '%')
+        </if>
+        <if test="productCharCode != null  and productCharCode != ''">
+            and PRODUCT_CHAR_CODE = #{productCharCode}
+        </if>
+        <if test="goodsId != null  and goodsId != ''">
+            and GOODS_ID = #{goodsId}
+        </if>
+        <if test="useTo != null  and useTo != ''">
+            and USE_TO = #{useTo}
+        </if>
+        <if test="gCertFlag != null  and gCertFlag != ''">
+            and G_CERT_FLAG = #{gCertFlag}
+        </if>
+        <if test="mnufctrRegNo != null  and mnufctrRegNo != ''">
+            and MNUFCTR_REG_NO = #{mnufctrRegNo}
+        </if>
+        <if test="CAS != null  and CAS != ''">
+            and CAS = #{CAS}
+        </if>
+        <if test="goodsType != null  and goodsType != ''">
+            and GOODS_TYPE = #{goodsType}
+        </if>
+        </where>
+    </select>
+
+    <select id="selectByID" parameterType="String"
+        resultMap="NewDeclaredGoodsResult">
+        <include refid="baseVo"/>
+        where ID = #{ID}
+    </select>
+
+    <insert id="insert" parameterType="NewDeclaredGoods">
+        insert into WXJY_NEW_DECLARED_GOODS
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="ID != null and ID != ''">ID,
+            </if>
+            <if test="entryId != null">ENTRY_ID,
+            </if>
+            <if test="gNo != null">G_NO,
+            </if>
+            <if test="ieFlag != null">IE_FLAG,
+            </if>
+            <if test="iePort != null">IE_PORT,
+            </if>
+            <if test="declPort != null">DECL_PORT,
+            </if>
+            <if test="customsCode != null">CUSTOMS_CODE,
+            </if>
+            <if test="declDate != null">DECL_DATE,
+            </if>
+            <if test="consignScc != null">CONSIGN_SCC,
+            </if>
+            <if test="consignCode != null">CONSIGN_CODE,
+            </if>
+            <if test="consignName != null">CONSIGN_NAME,
+            </if>
+            <if test="codeTs != null">CODE_TS,
+            </if>
+            <if test="iqCode != null">IQ_CODE,
+            </if>
+            <if test="gName != null">G_NAME,
+            </if>
+            <if test="iqGName != null">IQ_G_NAME,
+            </if>
+            <if test="gNameFn != null">G_NAME_FN,
+            </if>
+            <if test="gModel != null">G_MODEL,
+            </if>
+            <if test="iqGModel != null">IQ_G_MODEL,
+            </if>
+            <if test="gComposition != null">G_COMPOSITION,
+            </if>
+            <if test="prodWarranty != null">PROD_WARRANTY,
+            </if>
+            <if test="prodValidaty != null">PROD_VALIDATY,
+            </if>
+            <if test="dutyMode != null">DUTY_MODE,
+            </if>
+            <if test="GTIN != null">GTIN,
+            </if>
+            <if test="gQty != null">G_QTY,
+            </if>
+            <if test="gUnit != null">G_UNIT,
+            </if>
+            <if test="qty1 != null">QTY_1,
+            </if>
+            <if test="unit1 != null">UNIT_1,
+            </if>
+            <if test="qty2 != null">QTY_2,
+            </if>
+            <if test="unit2 != null">UNIT_2,
+            </if>
+            <if test="declPrice != null">DECL_PRICE,
+            </if>
+            <if test="declTotal != null">DECL_TOTAL,
+            </if>
+            <if test="tradeCurr != null">TRADE_CURR,
+            </if>
+            <if test="tradeTotal != null">TRADE_TOTAL,
+            </if>
+            <if test="dutyValue != null">DUTY_VALUE,
+            </if>
+            <if test="rmbPrice != null">RMB_PRICE,
+            </if>
+            <if test="usdPrice != null">USD_PRICE,
+            </if>
+            <if test="exchangeRate != null">EXCHANGE_RATE,
+            </if>
+            <if test="originCountry != null">ORIGIN_COUNTRY,
+            </if>
+            <if test="originRegionCode != null">ORIGIN_REGION_CODE,
+            </if>
+            <if test="destCountry != null">DEST_COUNTRY,
+            </if>
+            <if test="ieDistrictCode != null">IE_DISTRICT_CODE,
+            </if>
+            <if test="iqIeDistrictCode != null">IQ_IE_DISTRICT_CODE,
+            </if>
+            <if test="frnProducerName != null">FRN_PRODUCER_NAME,
+            </if>
+            <if test="productModel != null">PRODUCT_MODEL,
+            </if>
+            <if test="productBrand != null">PRODUCT_BRAND,
+            </if>
+            <if test="productDate != null">PRODUCT_DATE,
+            </if>
+            <if test="productBatch != null">PRODUCT_BATCH,
+            </if>
+            <if test="UNGID != null">UNGID,
+            </if>
+            <if test="ungFlag != null">UNG_FLAG,
+            </if>
+            <if test="ungModel != null">UNG_MODEL,
+            </if>
+            <if test="ungClassify != null">UNG_CLASSIFY,
+            </if>
+            <if test="ungGName != null">UNG_G_NAME,
+            </if>
+            <if test="productCharCode != null">PRODUCT_CHAR_CODE,
+            </if>
+            <if test="goodsId != null">GOODS_ID,
+            </if>
+            <if test="useTo != null">USE_TO,
+            </if>
+            <if test="gCertFlag != null">G_CERT_FLAG,
+            </if>
+            <if test="mnufctrRegNo != null">MNUFCTR_REG_NO,
+            </if>
+            <if test="CAS != null">CAS,
+            </if>
+            <if test="goodsType != null">GOODS_TYPE,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="ID != null and ID != ''">#{ID},
+            </if>
+            <if test="entryId != null">#{entryId},
+            </if>
+            <if test="gNo != null">#{gNo},
+            </if>
+            <if test="ieFlag != null">#{ieFlag},
+            </if>
+            <if test="iePort != null">#{iePort},
+            </if>
+            <if test="declPort != null">#{declPort},
+            </if>
+            <if test="customsCode != null">#{customsCode},
+            </if>
+            <if test="declDate != null">#{declDate},
+            </if>
+            <if test="consignScc != null">#{consignScc},
+            </if>
+            <if test="consignCode != null">#{consignCode},
+            </if>
+            <if test="consignName != null">#{consignName},
+            </if>
+            <if test="codeTs != null">#{codeTs},
+            </if>
+            <if test="iqCode != null">#{iqCode},
+            </if>
+            <if test="gName != null">#{gName},
+            </if>
+            <if test="iqGName != null">#{iqGName},
+            </if>
+            <if test="gNameFn != null">#{gNameFn},
+            </if>
+            <if test="gModel != null">#{gModel},
+            </if>
+            <if test="iqGModel != null">#{iqGModel},
+            </if>
+            <if test="gComposition != null">#{gComposition},
+            </if>
+            <if test="prodWarranty != null">#{prodWarranty},
+            </if>
+            <if test="prodValidaty != null">#{prodValidaty},
+            </if>
+            <if test="dutyMode != null">#{dutyMode},
+            </if>
+            <if test="GTIN != null">#{GTIN},
+            </if>
+            <if test="gQty != null">#{gQty},
+            </if>
+            <if test="gUnit != null">#{gUnit},
+            </if>
+            <if test="qty1 != null">#{qty1},
+            </if>
+            <if test="unit1 != null">#{unit1},
+            </if>
+            <if test="qty2 != null">#{qty2},
+            </if>
+            <if test="unit2 != null">#{unit2},
+            </if>
+            <if test="declPrice != null">#{declPrice},
+            </if>
+            <if test="declTotal != null">#{declTotal},
+            </if>
+            <if test="tradeCurr != null">#{tradeCurr},
+            </if>
+            <if test="tradeTotal != null">#{tradeTotal},
+            </if>
+            <if test="dutyValue != null">#{dutyValue},
+            </if>
+            <if test="rmbPrice != null">#{rmbPrice},
+            </if>
+            <if test="usdPrice != null">#{usdPrice},
+            </if>
+            <if test="exchangeRate != null">#{exchangeRate},
+            </if>
+            <if test="originCountry != null">#{originCountry},
+            </if>
+            <if test="originRegionCode != null">#{originRegionCode},
+            </if>
+            <if test="destCountry != null">#{destCountry},
+            </if>
+            <if test="ieDistrictCode != null">#{ieDistrictCode},
+            </if>
+            <if test="iqIeDistrictCode != null">#{iqIeDistrictCode},
+            </if>
+            <if test="frnProducerName != null">#{frnProducerName},
+            </if>
+            <if test="productModel != null">#{productModel},
+            </if>
+            <if test="productBrand != null">#{productBrand},
+            </if>
+            <if test="productDate != null">#{productDate},
+            </if>
+            <if test="productBatch != null">#{productBatch},
+            </if>
+            <if test="UNGID != null">#{UNGID},
+            </if>
+            <if test="ungFlag != null">#{ungFlag},
+            </if>
+            <if test="ungModel != null">#{ungModel},
+            </if>
+            <if test="ungClassify != null">#{ungClassify},
+            </if>
+            <if test="ungGName != null">#{ungGName},
+            </if>
+            <if test="productCharCode != null">#{productCharCode},
+            </if>
+            <if test="goodsId != null">#{goodsId},
+            </if>
+            <if test="useTo != null">#{useTo},
+            </if>
+            <if test="gCertFlag != null">#{gCertFlag},
+            </if>
+            <if test="mnufctrRegNo != null">#{mnufctrRegNo},
+            </if>
+            <if test="CAS != null">#{CAS},
+            </if>
+            <if test="goodsType != null">#{goodsType},
+            </if>
+        </trim>
+    </insert>
+
+    <update id="update" parameterType="NewDeclaredGoods">
+        update WXJY_NEW_DECLARED_GOODS
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="entryId != null">ENTRY_ID =
+                #{entryId},
+            </if>
+            <if test="gNo != null">G_NO =
+                #{gNo},
+            </if>
+            <if test="ieFlag != null">IE_FLAG =
+                #{ieFlag},
+            </if>
+            <if test="iePort != null">IE_PORT =
+                #{iePort},
+            </if>
+            <if test="declPort != null">DECL_PORT =
+                #{declPort},
+            </if>
+            <if test="customsCode != null">CUSTOMS_CODE =
+                #{customsCode},
+            </if>
+            <if test="declDate != null">DECL_DATE =
+                #{declDate},
+            </if>
+            <if test="consignScc != null">CONSIGN_SCC =
+                #{consignScc},
+            </if>
+            <if test="consignCode != null">CONSIGN_CODE =
+                #{consignCode},
+            </if>
+            <if test="consignName != null">CONSIGN_NAME =
+                #{consignName},
+            </if>
+            <if test="codeTs != null">CODE_TS =
+                #{codeTs},
+            </if>
+            <if test="iqCode != null">IQ_CODE =
+                #{iqCode},
+            </if>
+            <if test="gName != null">G_NAME =
+                #{gName},
+            </if>
+            <if test="iqGName != null">IQ_G_NAME =
+                #{iqGName},
+            </if>
+            <if test="gNameFn != null">G_NAME_FN =
+                #{gNameFn},
+            </if>
+            <if test="gModel != null">G_MODEL =
+                #{gModel},
+            </if>
+            <if test="iqGModel != null">IQ_G_MODEL =
+                #{iqGModel},
+            </if>
+            <if test="gComposition != null">G_COMPOSITION =
+                #{gComposition},
+            </if>
+            <if test="prodWarranty != null">PROD_WARRANTY =
+                #{prodWarranty},
+            </if>
+            <if test="prodValidaty != null">PROD_VALIDATY =
+                #{prodValidaty},
+            </if>
+            <if test="dutyMode != null">DUTY_MODE =
+                #{dutyMode},
+            </if>
+            <if test="GTIN != null">GTIN =
+                #{GTIN},
+            </if>
+            <if test="gQty != null">G_QTY =
+                #{gQty},
+            </if>
+            <if test="gUnit != null">G_UNIT =
+                #{gUnit},
+            </if>
+            <if test="qty1 != null">QTY_1 =
+                #{qty1},
+            </if>
+            <if test="unit1 != null">UNIT_1 =
+                #{unit1},
+            </if>
+            <if test="qty2 != null">QTY_2 =
+                #{qty2},
+            </if>
+            <if test="unit2 != null">UNIT_2 =
+                #{unit2},
+            </if>
+            <if test="declPrice != null">DECL_PRICE =
+                #{declPrice},
+            </if>
+            <if test="declTotal != null">DECL_TOTAL =
+                #{declTotal},
+            </if>
+            <if test="tradeCurr != null">TRADE_CURR =
+                #{tradeCurr},
+            </if>
+            <if test="tradeTotal != null">TRADE_TOTAL =
+                #{tradeTotal},
+            </if>
+            <if test="dutyValue != null">DUTY_VALUE =
+                #{dutyValue},
+            </if>
+            <if test="rmbPrice != null">RMB_PRICE =
+                #{rmbPrice},
+            </if>
+            <if test="usdPrice != null">USD_PRICE =
+                #{usdPrice},
+            </if>
+            <if test="exchangeRate != null">EXCHANGE_RATE =
+                #{exchangeRate},
+            </if>
+            <if test="originCountry != null">ORIGIN_COUNTRY =
+                #{originCountry},
+            </if>
+            <if test="originRegionCode != null">ORIGIN_REGION_CODE =
+                #{originRegionCode},
+            </if>
+            <if test="destCountry != null">DEST_COUNTRY =
+                #{destCountry},
+            </if>
+            <if test="ieDistrictCode != null">IE_DISTRICT_CODE =
+                #{ieDistrictCode},
+            </if>
+            <if test="iqIeDistrictCode != null">IQ_IE_DISTRICT_CODE =
+                #{iqIeDistrictCode},
+            </if>
+            <if test="frnProducerName != null">FRN_PRODUCER_NAME =
+                #{frnProducerName},
+            </if>
+            <if test="productModel != null">PRODUCT_MODEL =
+                #{productModel},
+            </if>
+            <if test="productBrand != null">PRODUCT_BRAND =
+                #{productBrand},
+            </if>
+            <if test="productDate != null">PRODUCT_DATE =
+                #{productDate},
+            </if>
+            <if test="productBatch != null">PRODUCT_BATCH =
+                #{productBatch},
+            </if>
+            <if test="UNGID != null">UNGID =
+                #{UNGID},
+            </if>
+            <if test="ungFlag != null">UNG_FLAG =
+                #{ungFlag},
+            </if>
+            <if test="ungModel != null">UNG_MODEL =
+                #{ungModel},
+            </if>
+            <if test="ungClassify != null">UNG_CLASSIFY =
+                #{ungClassify},
+            </if>
+            <if test="ungGName != null">UNG_G_NAME =
+                #{ungGName},
+            </if>
+            <if test="productCharCode != null">PRODUCT_CHAR_CODE =
+                #{productCharCode},
+            </if>
+            <if test="goodsId != null">GOODS_ID =
+                #{goodsId},
+            </if>
+            <if test="useTo != null">USE_TO =
+                #{useTo},
+            </if>
+            <if test="gCertFlag != null">G_CERT_FLAG =
+                #{gCertFlag},
+            </if>
+            <if test="mnufctrRegNo != null">MNUFCTR_REG_NO =
+                #{mnufctrRegNo},
+            </if>
+            <if test="CAS != null">CAS =
+                #{CAS},
+            </if>
+            <if test="goodsType != null">GOODS_TYPE =
+                #{goodsType},
+            </if>
+        </trim>
+        where ID = #{ID}
+    </update>
+
+    <delete id="deleteByID" parameterType="String">
+        delete
+        from WXJY_NEW_DECLARED_GOODS where ID = #{ID}
+    </delete>
+
+    <delete id="deleteByIDs" parameterType="String">
+        delete from WXJY_NEW_DECLARED_GOODS where ID in
+        <foreach item="ID" collection="array" open="(" separator="," close=")">
+            #{ID}
+        </foreach>
+    </delete>
+
+    <delete id="logicDelete" parameterType="String">
+        update  WXJY_NEW_DECLARED_GOODS set is_del = 1  where ID = #{ID}
+    </delete>
+</mapper>

+ 0 - 149
wxjy-wxjy-service/src/main/resources/vm-xiong/java/controller.java.vm

@@ -1,149 +0,0 @@
-package ${packageName}.controller;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
-import cn.gov.customs.cacp.sdks.core.user.trans.UserContextHolder;
-import cn.gov.customs.zhsj.common.utils.StringUtils;
-import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import cn.gov.customs.zhsj.common.annotation.Log;
-import cn.gov.customs.zhsj.common.core.controller.BaseController;
-import cn.gov.customs.zhsj.common.core.domain.AjaxResult;
-import cn.gov.customs.zhsj.common.enums.BusinessType;
-import org.springframework.web.multipart.MultipartFile;
-import ${packageName}.pojo.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
-import cn.gov.customs.zhsj.common.utils.poi.ExcelUtil;
-#if($table.crud || $table.sub)
-import cn.gov.customs.zhsj.common.core.page.TableDataInfo;
-#elseif($table.tree)
-#end
-
-/**
- * ${functionName}Controller
- *
- * @author ${author}
- * @date ${datetime}
- */
-@RestController
-@RequestMapping("/${moduleName}/${businessName}")
-@RequiredArgsConstructor
-public class ${ClassName}Controller extends BaseController {
-
-    private final I${ClassName}Service ${className}Service;
-
-
-    /**
-     * 查询${functionName}列表
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
-    @PostMapping("/get-list")
-    #if($table.crud || $table.sub)
-    public TableDataInfo list(@RequestBody ${ClassName} ${className}) {
-        startPage();
-        List<${ClassName}> list = ${className}Service.selectList(${className});
-        return getDataTable(list);
-    }
-    #elseif($table.tree)
-        public AjaxResult list(${ClassName} ${className}) {
-            List<${ClassName}> list = ${className}Service.selectList(${className});
-            return success(list);
-        }
-    #end
-
-    /**
-     * 导出${functionName}列表
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
-    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
-    @PostMapping("/get-${className}-export")
-    public void export(HttpServletResponse response, @RequestBody ${ClassName} ${className}) {
-        List<${ClassName}> list = ${className}Service.selectList(${className});
-        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class);
-        util.exportExcel(response, list, "${functionName}数据");
-    }
-
-    /**
-     * 获取${functionName}详细信息
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
-##    @GetMapping(value = "/{${pkColumn.javaField}}")
-    @GetMapping(value = "/get-detail")
-    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) {
-        return success(${className}Service.selectBy${pkColumn.capJavaField}(${pkColumn.javaField}));
-    }
-
-    /**
-     * 新增${functionName}
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
-    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
-    @PostMapping("/insert-${className}")
-    public AjaxResult add(@RequestBody ${ClassName} ${className}) {
-       #* ${className}.setCreateBy(getUserId().toString());
-        ${className}.setDeptId(getDeptId());
-        if(StringUtils.isEmpty(${className}.getCustomsCode())){
-            ${className}.setCustomsCode(busCache.getOrgDeptById(getDeptId()).getCustomsCode());
-        }*#
-        return toAjax(${className}Service.insert(${className}));
-    }
-
-    /**
-     * 修改${functionName}
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
-    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
-    @PostMapping("/update-${className}")
-    public AjaxResult edit(@RequestBody ${ClassName} ${className}) {
-##        ${className}.setUpdateBy(getUserId().toString());
-        return toAjax(${className}Service.update(${className}));
-    }
-
-    /**
-     * 删除${functionName}
-     */
-##    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
-    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
-    @PostMapping("/delete-${className}")
-    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) {
-        return toAjax(${className}Service.deleteBy${pkColumn.capJavaField}s(${pkColumn.javaField}s));
-    }
-
-    /**
-    * 获取导入模板
-    * @param response
-    */
-    @PostMapping("/template-${className}")
-    public void importTemplate(HttpServletResponse response)
-    {
-        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-        util.importTemplateExcel(response, "${functionName}");
-    }
-
-    /**
-    * 导入 ${functionName}
-    * @param file
-    * @param updateSupport
-    * @return
-    * @throws Exception
-    */
-    @Log(title = "${functionName}", businessType = BusinessType.IMPORT)
-    @PostMapping("/import-${className}")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
-        CacpTransUser user = UserContextHolder.currentUser();
-        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-        List<${ClassName}> ${className}List = util.importExcel(file.getInputStream());
-        String message = ${className}Service.import${ClassName}(${className}List, updateSupport, user);
-        return success(message);
-    }
-}

+ 0 - 79
wxjy-wxjy-service/src/main/resources/vm-xiong/java/service.java.vm

@@ -1,79 +0,0 @@
-package ${packageName}.service;
-
-import java.util.List;
-import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
-import ${packageName}.pojo.${ClassName};
-
-/**
- * ${functionName}Service接口
- *
- * @author ${author}
- * @date ${datetime}
- */
-public interface I${ClassName}Service {
-    /**
-     * 查询${functionName}
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    public ${ClassName} selectBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 查询${functionName}列表
-     *
-     * @param ${className} ${functionName}
-     * @return ${functionName}集合
-     */
-    public List<${ClassName}> selectList(${ClassName} ${className});
-
-    /**
-     * 新增${functionName}
-     *
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int insert(${ClassName} ${className});
-
-    /**
-     * 修改${functionName}
-     *
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int update(${ClassName} ${className});
-
-    /**
-     * 批量删除${functionName}
-     *
-     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
-     * @return 结果
-     */
-    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-
-    /**
-     * 删除${functionName}信息
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 逻辑删除${functionName}信息
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 导入${functionName}数据
-     *
-     * @param ${className}List ${functionName}数据列表
-     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param cacpTransUser 操作用户
-     * @return 结果
-     */
-    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser);
-}

+ 0 - 244
wxjy-wxjy-service/src/main/resources/vm-xiong/java/serviceImpl.java.vm

@@ -1,244 +0,0 @@
-package ${packageName}.service.impl;
-
-import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
-import cn.gov.customs.zhsj.common.exception.ServiceException;
-import cn.gov.customs.zhsj.common.utils.StringUtils;
-import cn.gov.customs.zhsj.common.utils.bean.BeanValidators;
-import cn.gov.customs.zhsj.common.utils.uuid.SnowflakeIdWorker;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import javax.validation.Validator;
-import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import cn.gov.customs.zhsj.common.utils.DateUtils;
-#foreach ($column in $columns)
-        #if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
-import cn.gov.customs.zhsj.common.utils.DateUtils;
-            #break
-        #end
-    #end
-#if($table.sub)
-import ${packageName}.pojo.${subClassName};
-    #end
-import ${packageName}.dao.${ClassName}Mapper;
-import ${packageName}.pojo.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
-
-/**
- * ${functionName}Service业务层处理
- *
- * @author ${author}
- * @date ${datetime}
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class ${ClassName}ServiceImpl implements I${ClassName}Service {
-
-    private final ${ClassName}Mapper ${className}Mapper;
-
-    private final Validator validator;
-
-    /**
-     * 查询${functionName}
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    @Override
-    public ${ClassName} selectBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
-        return ${className}Mapper.selectBy${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-
-    /**
-     * 查询${functionName}列表
-     *
-     * @param ${className} ${functionName}
-     * @return ${functionName}
-     */
-    @Override
-    public List<${ClassName}> selectList(${ClassName} ${className}) {
-        return ${className}Mapper.selectList(${className});
-    }
-
-    /**
-     * 新增${functionName}
-     *
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-        #if($table.sub)
-        @Transactional
-        #end
-    @Override
-    public int insert(${ClassName} ${className}) {
-        #foreach ($column in $columns)
-            #if($column.javaField == 'id')
-                ${className}.setId(new SnowflakeIdWorker(0, 0).nextId());
-            #end
-            #if($column.javaField == 'createTime')
-                ${className}.setCreateTime(DateUtils.getNowDate());
-            #end
-            #if($column.javaField == 'updateTime')
-                ${className}.setUpdateTime(DateUtils.getNowDate());
-            #end
-            #if($column.javaField == 'status')
-                ${className}.setStatus("0");
-            #end
-        #end
-        #if($table.sub)
-            int rows = ${className}Mapper.insert${ClassName}(${className});
-            insert${subClassName}(${className});
-            return rows;
-        #else
-            return ${className}Mapper.insert(${className});
-        #end
-    }
-
-    /**
-     * 修改${functionName}
-     *
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    #if($table.sub)
-    @Transactional
-    #end
-    @Override
-    public int update(${ClassName} ${className}) {
-        #foreach ($column in $columns)
-            #if($column.javaField == 'updateTime')
-                ${className}.setUpdateTime(DateUtils.getNowDate());
-            #end
-        #end
-        #if($table.sub)
-                ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}())
-            ;
-            insert${subClassName}(${className});
-        #end
-        return ${className}Mapper.update(${className});
-    }
-
-    /**
-     * 批量删除${functionName}
-     *
-     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键
-     * @return 结果
-     */
-    #if($table.sub)
-    @Transactional
-    #end
-    @Override
-    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) {
-        #if($table.sub)
-                ${className}Mapper.deleteBy${subTableFkClassName}s(${pkColumn.javaField}s);
-        #end
-        return ${className}Mapper.deleteBy${pkColumn.capJavaField}s(${pkColumn.javaField}s);
-    }
-
-    /**
-     * 删除${functionName}信息
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    #if($table.sub)
-    @Transactional
-    #end
-    @Override
-    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
-        #if($table.sub)
-                ${className}Mapper.deleteBy${subTableFkClassName}(${pkColumn.javaField});
-        #end
-        return ${className}Mapper.deleteBy${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-
-    /**
-     * 逻辑删除${functionName}信息
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    #if($table.sub)
-    @Transactional
-    #end
-    @Override
-    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField}) {
-
-        return ${className}Mapper.logicDelete(${pkColumn.javaField});
-    }
-
-    #if($table.sub)
-    /**
-     * 新增${subTable.functionName}信息
-     *
-     * @param ${className} ${functionName}对象
-     */
-    public void insert${subClassName}(${ClassName} ${className}) {
-        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
-        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
-        if (StringUtils.isNotNull(${subclassName}List)) {
-            List<${subClassName}> list = new ArrayList<${subClassName}>();
-            for (${subClassName} ${subclassName} :${subclassName}List)
-            {
-                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
-                list.add(${subclassName});
-            }
-            if (list.size() > 0) {
-                    ${className}Mapper.batch(list);
-            }
-        }
-    }
-
-    #end
-    /**
-     * 导入${functionName}数据
-     *
-     * @param ${className}List ${functionName}数据列表
-     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param cacpTransUser 操作用户
-     * @return 结果
-     */
-    @Override
-    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser) {
-        if (CollectionUtils.isEmpty(${className}List)) {
-            throw new ServiceException("导入数据不能为空!");
-        }
-        int successNum = 0;
-        int failureNum = 0;
-        StringBuilder successMsg = new StringBuilder();
-        StringBuilder failureMsg = new StringBuilder();
-        for (${ClassName} ${className} : ${className}List) {
-            try {
-
-                BeanValidators.validateWithException(validator, ${className});
-                //id名称不统一,自行处理
-##                ${className}.setId(new SnowflakeIdWorker(0, 0).nextId());
-                ${className}.setCreateTime(DateUtils.getNowDate());
-                ${className}.setUpdateTime(DateUtils.getNowDate());
-                ${className}.setCreateUser(cacpTransUser.getUserId());
-                ${className}.setCreateDept(cacpTransUser.getParentGuid());
-
-##                ${className}.setCustomsCode(cacpTransUser.getCustomsCode());
-##                ${className}.setStatus(0);
-                ${className}Mapper.insert(${className});
-                successNum++;
-                successMsg.append("<br/>" + successNum + "、 " + cacpTransUser.getUserName() + " 导入成功");
-
-            } catch (Exception e) {
-                failureNum++;
-                String msg = "<br/>" + failureNum + "、" + cacpTransUser.getUserName() + " 导入失败:";
-                failureMsg.append(msg + e.getMessage());
-                log.error(msg, e);
-            }
-        }
-        if (failureNum > 0) {
-            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
-            throw new ServiceException(failureMsg.toString());
-        } else {
-            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
-        }
-        return successMsg.toString();
-    }
-}

+ 0 - 44
wxjy-wxjy-service/src/main/resources/vm-xiong/js/api.js.vm

@@ -1,44 +0,0 @@
-import request from '@/utils/request'
-
-// 查询${functionName}列表
-export function list${BusinessName}(query) {
-  return request({
-    url: '/${moduleName}/${businessName}/list',
-    method: 'get',
-    params: query
-  })
-}
-
-// 查询${functionName}详细
-export function get${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'get'
-  })
-}
-
-// 新增${functionName}
-export function add${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'post',
-    data: data
-  })
-}
-
-// 修改${functionName}
-export function update${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'put',
-    data: data
-  })
-}
-
-// 删除${functionName}
-export function del${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'delete'
-  })
-}

+ 0 - 3
wxjy-wxjy-service/src/main/resources/vm-xiong/sql/sql.vm

@@ -1,3 +0,0 @@
--- 菜单 SQL
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单');

+ 0 - 24
wxjy-wxjy-service/src/main/resources/vm-xiong/sql/sql_bak.vm

@@ -1,24 +0,0 @@
--- 菜单 SQL
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单');
-
--- 按钮父菜单ID
--- SELECT @parentId := LAST_INSERT_ID();
-select max(menu_id) max_id from sys_menu;
-
-
--- 按钮 SQL
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}查询', max_id, '1',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '#', 'admin', sysdate(), '', null, '');

+ 0 - 505
wxjy-wxjy-service/src/main/resources/vm-xiong/vue/index-tree.vue.vm

@@ -1,505 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-        #foreach($column in $columns)
-            #if($column.query)
-                #set($dictType=$column.dictType)
-                #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                #set($parentheseIndex=$column.columnComment.indexOf("("))
-                #if($parentheseIndex != -1)
-                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                #else
-                    #set($comment=$column.columnComment)
-                #end
-                #if($column.htmlType == "input")
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-input
-                        v-model="queryParams.${column.javaField}"
-                        placeholder="请输入${comment}"
-                        clearable
-                        @keyup.enter.native="handleQuery"
-                    />
-                  </el-form-item>
-                #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                      <el-option
-                          v-for="dict in dict.type.${dictType}"
-                          :key="dict.value"
-                          :label="dict.label"
-                          :value="dict.value"
-                      />
-                    </el-select>
-                  </el-form-item>
-                #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                      <el-option label="请选择字典生成" value="" />
-                    </el-select>
-                  </el-form-item>
-                #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-date-picker clearable
-                                    v-model="queryParams.${column.javaField}"
-                                    type="date"
-                                    value-format="yyyy-MM-dd"
-                                    placeholder="选择${comment}">
-                    </el-date-picker>
-                  </el-form-item>
-                #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  <el-form-item label="${comment}">
-                    <el-date-picker
-                        v-model="daterange${AttrName}"
-                        style="width: 240px"
-                        value-format="yyyy-MM-dd"
-                        type="daterange"
-                        range-separator="-"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
-                    ></el-date-picker>
-                  </el-form-item>
-                #end
-            #end
-        #end
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="el-icon-plus"
-            size="mini"
-            @click="handleAdd"
-            v-hasPermi="['${moduleName}:${businessName}:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="info"
-            plain
-            icon="el-icon-sort"
-            size="mini"
-            @click="toggleExpandAll"
-        >展开/折叠</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table
-        v-if="refreshTable"
-        v-loading="loading"
-        :data="${businessName}List"
-        row-key="${treeCode}"
-        :default-expand-all="isExpandAll"
-        :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-    >
-        #foreach($column in $columns)
-            #set($javaField=$column.javaField)
-            #set($parentheseIndex=$column.columnComment.indexOf("("))
-            #if($parentheseIndex != -1)
-                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-            #else
-                #set($comment=$column.columnComment)
-            #end
-            #if($column.pk)
-            #elseif($column.list && $column.htmlType == "datetime")
-              <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-                <template slot-scope="scope">
-                  <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-                </template>
-              </el-table-column>
-            #elseif($column.list && $column.htmlType == "imageUpload")
-              <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-                <template slot-scope="scope">
-                  <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-                </template>
-              </el-table-column>
-            #elseif($column.list && "" != $column.dictType)
-              <el-table-column label="${comment}" align="center" prop="${javaField}">
-                <template slot-scope="scope">
-                    #if($column.htmlType == "checkbox")
-                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-                    #else
-                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
-                    #end
-                </template>
-              </el-table-column>
-            #elseif($column.list && "" != $javaField)
-                #if(${foreach.index} == 1)
-                  <el-table-column label="${comment}" prop="${javaField}" />
-                #else
-                  <el-table-column label="${comment}" align="center" prop="${javaField}" />
-                #end
-            #end
-        #end
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleUpdate(scope.row)"
-              v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >修改</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-plus"
-              @click="handleAdd(scope.row)"
-              v-hasPermi="['${moduleName}:${businessName}:add']"
-          >新增</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-delete"
-              @click="handleDelete(scope.row)"
-              v-hasPermi="['${moduleName}:${businessName}:remove']"
-          >删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-          #foreach($column in $columns)
-              #set($field=$column.javaField)
-              #if($column.insert && !$column.pk)
-                  #if(($column.usableColumn) || (!$column.superColumn))
-                      #set($parentheseIndex=$column.columnComment.indexOf("("))
-                      #if($parentheseIndex != -1)
-                          #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                      #else
-                          #set($comment=$column.columnComment)
-                      #end
-                      #set($dictType=$column.dictType)
-                      #if("" != $treeParentCode && $column.javaField == $treeParentCode)
-                        <el-form-item label="${comment}" prop="${treeParentCode}">
-                          <treeselect v-model="form.${treeParentCode}" :options="${businessName}Options" :normalizer="normalizer" placeholder="请选择${comment}" />
-                        </el-form-item>
-                      #elseif($column.htmlType == "input")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-                        </el-form-item>
-                      #elseif($column.htmlType == "imageUpload")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <image-upload v-model="form.${field}"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "fileUpload")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <file-upload v-model="form.${field}"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "editor")
-                        <el-form-item label="${comment}">
-                          <editor v-model="form.${field}" :min-height="192"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "select" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                            <el-option
-                                v-for="dict in dict.type.${dictType}"
-                                :key="dict.value"
-                                :label="dict.label"
-                                #if($column.javaType == "Integer" || $column.javaType == "Long")
-                                :value="parseInt(dict.value)"
-                                #else
-                                :value="dict.value"
-                                #end
-                            ></el-option>
-                          </el-select>
-                        </el-form-item>
-                      #elseif($column.htmlType == "select" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                            <el-option label="请选择字典生成" value="" />
-                          </el-select>
-                        </el-form-item>
-                      #elseif($column.htmlType == "checkbox" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-checkbox-group v-model="form.${field}">
-                            <el-checkbox
-                                v-for="dict in dict.type.${dictType}"
-                                :key="dict.value"
-                                :label="dict.value">
-                              {{dict.label}}
-                            </el-checkbox>
-                          </el-checkbox-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "checkbox" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-checkbox-group v-model="form.${field}">
-                            <el-checkbox>请选择字典生成</el-checkbox>
-                          </el-checkbox-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "radio" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-radio-group v-model="form.${field}">
-                            <el-radio
-                                v-for="dict in dict.type.${dictType}"
-                                :key="dict.value"
-                                #if($column.javaType == "Integer" || $column.javaType == "Long")
-                                :label="parseInt(dict.value)"
-                                #else
-                                :label="dict.value"
-                                #end
-                            >{{dict.label}}</el-radio>
-                          </el-radio-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "radio" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-radio-group v-model="form.${field}">
-                            <el-radio label="1">请选择字典生成</el-radio>
-                          </el-radio-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "datetime")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-date-picker clearable
-                                          v-model="form.${field}"
-                                          type="date"
-                                          value-format="yyyy-MM-dd"
-                                          placeholder="选择${comment}">
-                          </el-date-picker>
-                        </el-form-item>
-                      #elseif($column.htmlType == "textarea")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
-                        </el-form-item>
-                      #end
-                  #end
-              #end
-          #end
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-  import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-  import Treeselect from "@riophae/vue-treeselect";
-  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-
-  export default {
-    name: "${BusinessName}",
-      #if(${dicts} != '')
-        dicts: [${dicts}],
-      #end
-    components: {
-      Treeselect
-    },
-    data() {
-      return {
-        // 遮罩层
-        loading: true,
-        // 显示搜索条件
-        showSearch: true,
-        // ${functionName}表格数据
-              ${businessName}List: [],
-        // ${functionName}树选项
-              ${businessName}Options: [],
-        // 弹出层标题
-        title: "",
-        // 是否显示弹出层
-        open: false,
-        // 是否展开,默认全部展开
-        isExpandAll: true,
-        // 重新渲染表格状态
-        refreshTable: true,
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                // $comment时间范围
-                daterange${AttrName}: [],
-              #end
-          #end
-        // 查询参数
-        queryParams: {
-            #foreach ($column in $columns)
-                #if($column.query)
-                        $column.javaField: null#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        },
-        // 表单参数
-        form: {},
-        // 表单校验
-        rules: {
-            #foreach ($column in $columns)
-                #if($column.required)
-                    #set($parentheseIndex=$column.columnComment.indexOf("("))
-                    #if($parentheseIndex != -1)
-                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                    #else
-                        #set($comment=$column.columnComment)
-                    #end
-                        $column.javaField: [
-                    { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-                  ]#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        }
-      };
-    },
-    created() {
-      this.getList();
-    },
-    methods: {
-      /** 查询${functionName}列表 */
-      getList() {
-        this.loading = true;
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                this.queryParams.params = {};
-                  #break
-              #end
-          #end
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
-                  this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
-                  this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
-                }
-              #end
-          #end
-        list${BusinessName}(this.queryParams).then(response => {
-          this.${businessName}List = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-          this.loading = false;
-        });
-      },
-      /** 转换${functionName}数据结构 */
-      normalizer(node) {
-        if (node.children && !node.children.length) {
-          delete node.children;
-        }
-        return {
-          id: node.${treeCode},
-          label: node.${treeName},
-          children: node.children
-        };
-      },
-      /** 查询${functionName}下拉树结构 */
-      getTreeselect() {
-        list${BusinessName}().then(response => {
-          this.${businessName}Options = [];
-          const data = { ${treeCode}: 0, ${treeName}: '顶级节点', children: [] };
-          data.children = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-          this.${businessName}Options.push(data);
-        });
-      },
-      // 取消按钮
-      cancel() {
-        this.open = false;
-        this.reset();
-      },
-      // 表单重置
-      reset() {
-        this.form = {
-            #foreach ($column in $columns)
-                #if($column.htmlType == "checkbox")
-                        $column.javaField: []#if($foreach.count != $columns.size()),#end
-                #else
-                        $column.javaField: null#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        };
-        this.resetForm("form");
-      },
-      /** 搜索按钮操作 */
-      handleQuery() {
-        this.getList();
-      },
-      /** 重置按钮操作 */
-      resetQuery() {
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                this.daterange${AttrName} = [];
-              #end
-          #end
-        this.resetForm("queryForm");
-        this.handleQuery();
-      },
-      /** 新增按钮操作 */
-      handleAdd(row) {
-        this.reset();
-        this.getTreeselect();
-        if (row != null && row.${treeCode}) {
-          this.form.${treeParentCode} = row.${treeCode};
-        } else {
-          this.form.${treeParentCode} = 0;
-        }
-        this.open = true;
-        this.title = "添加${functionName}";
-      },
-      /** 展开/折叠操作 */
-      toggleExpandAll() {
-        this.refreshTable = false;
-        this.isExpandAll = !this.isExpandAll;
-        this.$nextTick(() => {
-          this.refreshTable = true;
-        });
-      },
-      /** 修改按钮操作 */
-      handleUpdate(row) {
-        this.reset();
-        this.getTreeselect();
-        if (row != null) {
-          this.form.${treeParentCode} = row.${treeParentCode};
-        }
-        get${BusinessName}(row.${pkColumn.javaField}).then(response => {
-          this.form = response.data;
-            #foreach ($column in $columns)
-                #if($column.htmlType == "checkbox")
-                  this.form.$column.javaField = this.form.${column.javaField}.split(",");
-                #end
-            #end
-          this.open = true;
-          this.title = "修改${functionName}";
-        });
-      },
-      /** 提交按钮 */
-      submitForm() {
-        this.#[[$]]#refs["form"].validate(valid => {
-          if (valid) {
-            #foreach ($column in $columns)
-            #if($column.htmlType == "checkbox")
-            this.form.$column.javaField = this.form.${column.javaField}.join(",");
-            #end
-            #end
-            if (this.form.${pkColumn.javaField} != null) {
-              update${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("修改成功");
-                this.open = false;
-                this.getList();
-              });
-            } else {
-              add${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("新增成功");
-                this.open = false;
-                this.getList();
-              });
-            }
-          }
-        });
-      },
-      /** 删除按钮操作 */
-      handleDelete(row) {
-        this.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?').then(function() {
-          return del${BusinessName}(row.${pkColumn.javaField});
-        }).then(() => {
-          this.getList();
-          this.#[[$modal]]#.msgSuccess("删除成功");
-        }).catch(() => {});
-      }
-    }
-  };
-</script>

+ 0 - 778
wxjy-wxjy-service/src/main/resources/vm-xiong/vue/index.vue.vm

@@ -1,778 +0,0 @@
-<template>
-  <div class="app-container" style="padding-top: 10px;">
-    <div class="content-margin-query" style="">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-    #foreach($column in $columns)
-    #if($column.query)
-    #set($dictType=$column.dictType)
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-            v-model="queryParams.${column.javaField}"
-            placeholder="请输入${comment}"
-            clearable
-            @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-##          <el-option
-##              v-for="dict in dict.type.${dictType}"
-##              :key="dict.value"
-##              :label="dict.label"
-##              :value="dict.value"
-##          />
-        </el-select>
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-                        v-model="queryParams.${column.javaField}"
-                        type="date"
-                        value-format="yyyy-MM-dd"
-                        placeholder="请选择${comment}">
-        </el-date-picker>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}">
-        <el-date-picker
-            v-model="daterange${AttrName}"
-            style="width: 240px"
-            value-format="yyyy-MM-dd"
-            type="daterange"
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-    #end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-    </div>
-
-    <div class="content-margin-table">
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="el-icon-plus"
-            size="mini"
-            @click="handleAdd"
-##            v-hasPermi="['${moduleName}:${businessName}:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="success"
-            plain
-            icon="el-icon-edit"
-            size="mini"
-            :disabled="single"
-            @click="handleUpdate"
-##            v-hasPermi="['${moduleName}:${businessName}:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="danger"
-            plain
-            icon="el-icon-delete"
-            size="mini"
-            :disabled="multiple"
-            @click="handleDelete"
-##            v-hasPermi="['${moduleName}:${businessName}:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="warning"
-            plain
-            icon="el-icon-download"
-            size="mini"
-            @click="handleExport"
-##            v-hasPermi="['${moduleName}:${businessName}:export']"
-        >导出</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="info"
-            plain
-            icon="el-icon-upload2"
-            size="mini"
-            @click="handleImport"
-            v-hasPermi="['bus:${businessName}:import']"
-        >导入</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-#foreach($column in $columns)
-    #set($javaField=$column.javaField)
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.pk)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-    #elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-##                <template slot-scope="scope">
-##                  <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-##                <template slot-scope="scope">
-##                  <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-##                <template slot-scope="scope">
-##                    #if($column.htmlType == "checkbox")
-##                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-##                    #else
-##                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
-##                    #end
-##                </template>
-      </el-table-column>
-    #elseif($column.list && "" != $javaField)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-    #end
-#end
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width"  width="150px">
-        <template slot-scope="scope">
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-view"
-              @click="handleView(scope.row)"
-              ##              v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >查看</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleUpdate(scope.row)"
-##              v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >修改</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-delete"
-              @click="handleDelete(scope.row)"
-##              v-hasPermi="['${moduleName}:${businessName}:remove']"
-          >删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-        v-show="total>0"
-        :total="total"
-        :page.sync="queryParams.pageNum"
-        :limit.sync="queryParams.pageSize"
-        @pagination="getList"
-    />
-    </div>
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-  #foreach($column in $columns)
-      #set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-  #if(($column.usableColumn) || (!$column.superColumn))
-      #set($parentheseIndex=$column.columnComment.indexOf("("))
-      #if($parentheseIndex != -1)
-          #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-      #else
-          #set($comment=$column.columnComment)
-      #end
-      #set($dictType=$column.dictType)
-      #if($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-        </el-form-item>
-      #elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-      #elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-      #elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-      #elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-##                    <el-option
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        :label="dict.label"
-##                        #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                        :value="parseInt(dict.value)"
-##                        #else
-##                        :value="dict.value"
-##                        #end
-##                    ></el-option>
-          </el-select>
-        </el-form-item>
-      #elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
-        </el-form-item>
-      #elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-##                    <el-checkbox
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        :label="dict.value">
-##                      {{dict.label}}
-##                    </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      #elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>请选择字典生成</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      #elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-##                  <el-radio-group v-model="form.${field}">
-##                    <el-radio
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                        :label="parseInt(dict.value)"
-##                        #else
-##                        :label="dict.value"
-##                        #end
-##                    >{{dict.label}}</el-radio>
-##                  </el-radio-group>
-        </el-form-item>
-      #elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">请选择字典生成</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      #elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-                          v-model="form.${field}"
-                          type="date"
-                          value-format="yyyy-MM-dd"
-                          placeholder="请选择${comment}">
-          </el-date-picker>
-        </el-form-item>
-      #elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-      #end
-  #end
-#end
-  #end
-  #if($table.sub)
-    <el-divider content-position="center">${subTable.functionName}信息</el-divider>
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">添加</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">删除</el-button>
-      </el-col>
-    </el-row>
-    <el-table highlight-selection-row :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="序号" align="center" prop="index" width="50"/>
-    #foreach($column in $subTable.columns)
-        #set($javaField=$column.javaField)
-        #set($parentheseIndex=$column.columnComment.indexOf("("))
-        #if($parentheseIndex != -1)
-            #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-        #else
-            #set($comment=$column.columnComment)
-        #end
-        #if($column.pk || $javaField == ${subTableFkclassName})
-        #elseif($column.list && $column.htmlType == "input")
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
-            </template>
-          </el-table-column>
-        #elseif($column.list && $column.htmlType == "datetime")
-          <el-table-column label="$comment" prop="${javaField}" width="240">
-            <template slot-scope="scope">
-              <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="yyyy-MM-dd" placeholder="请选择$comment" />
-            </template>
-          </el-table-column>
-        #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-##                <el-option
-##                    v-for="dict in dict.type.$column.dictType"
-##                    :key="dict.value"
-##                    :label="dict.label"
-##                    :value="dict.value"
-##                ></el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-        #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                <el-option label="请选择字典生成" value="" />
-              </el-select>
-            </template>
-          </el-table-column>
-        #end
-    #end
-    </el-table>
-  #end
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 查看的对话框 -->
-    <el-dialog :title="viewTitle" :visible.sync="viewOpen" width="500px" append-to-body>
-      <el-form ref="form" :model="viewForm" :rules="rules" label-width="80px">
-        <el-row>
-#foreach($column in $columns)
-  #set($field=$column.javaField)
-  #if($column.insert && !$column.pk)
-          #if(($column.usableColumn) || (!$column.superColumn))
-              #set($parentheseIndex=$column.columnComment.indexOf("("))
-              #if($parentheseIndex != -1)
-                  #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-              #else
-                  #set($comment=$column.columnComment)
-              #end
-              #set($dictType=$column.dictType)
-          <el-col :span="24">
-          #if($column.htmlType == "input")
-            <el-form-item label="${comment}:" prop="${field}"  label-width="120px">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "imageUpload")
-            <el-form-item label="${comment}:" prop="${field}" label-width="120px">
-              <image-upload v-model="viewForm.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "fileUpload")
-            <el-form-item label="${comment}:" prop="${field}"  label-width="120px">
-              <file-upload v-model="viewForm.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "editor")
-            <el-form-item label="${comment}:"  label-width="120px">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "select" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "select" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-checkbox-group v-model="viewForm.${field}">
-              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-checkbox-group v-model="viewForm.${field}">
-                <el-checkbox>请选择字典生成</el-checkbox>
-              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-radio-group v-model="viewForm.${field}">
-                <el-radio label="1">请选择字典生成</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          #elseif($column.htmlType == "datetime")
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "textarea")
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #end
-          </el-col>
-          #end
-  #end
-#end
-        </el-row>
-      </el-form>
-    </el-dialog>
-    <!-- 导入对话框 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-          ref="upload"
-          :limit="1"
-          accept=".xlsx, .xls"
-          :headers="upload.headers"
-          :action="upload.url + '?updateSupport=' + upload.updateSupport"
-          :disabled="upload.isUploading"
-          :on-progress="handleFileUploadProgress"
-          :on-success="handleFileSuccess"
-          :auto-upload="false"
-          drag
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据
-          </div>
-          <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
-        </div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">确 定</el-button>
-        <el-button @click="upload.open = false">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-  import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-  import {getToken} from "@/utils/auth";
-  export default {
-    name: "${BusinessName}",
-      #if(${dicts} != '')
-        dicts: [${dicts}],
-      #end
-    data() {
-      return {
-        viewTitle:"",
-          viewOpen:false,
-          viewForm:{},
-        // 遮罩层
-        loading: true,
-        // 选中数组
-        ids: [],
-          #if($table.sub)
-            // 子表选中数据
-            checked${subClassName}: [],
-          #end
-        // 非单个禁用
-        single: true,
-        // 非多个禁用
-        multiple: true,
-        // 显示搜索条件
-        showSearch: true,
-        // 总条数
-        total: 0,
-// ${functionName}表格数据
-      ${businessName}List: [],
-  #if($table.sub)
-    // ${subTable.functionName}表格数据
-          ${subclassName}List: [],
-  #end
-        // 弹出层标题
-        title: "",
-        // 是否显示弹出层
-        open: false,
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                // $comment时间范围
-                daterange${AttrName}: [],
-              #end
-          #end
-        // 查询参数
-        queryParams: {
-          pageNum: 1,
-          pageSize: 10,
-            #foreach ($column in $columns)
-                #if($column.query)
-          $column.javaField: null#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        },
-        // 表单参数
-        form: {},
-        // 表单校验
-        rules: {
-            #foreach ($column in $columns)
-    #if($column.required)
-        #set($parentheseIndex=$column.columnComment.indexOf("("))
-        #if($parentheseIndex != -1)
-            #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-        #else
-            #set($comment=$column.columnComment)
-        #end
-            $column.javaField: [
-        { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-      ]#if($foreach.count != $columns.size()),#end
-    #end
-#end
-        },
-        // ${functionName}导入参数
-        upload: {
-          // 是否显示弹出层(${functionName}导入)
-          open: false,
-          // 弹出层标题(${functionName}导入)
-          title: "",
-          // 是否禁用上传
-          isUploading: false,
-          // 是否更新已经存在的${functionName}数据
-          updateSupport: 0,
-          // 设置上传的请求头部
-          headers: { Authorization: "Bearer " + getToken() },
-          // 上传的地址
-          url: process.env.VUE_APP_BASE_API + "/${moduleName}/${businessName}/importData"
-        },
-      };
-    },
-    created() {
-      this.getList();
-    },
-    methods: {
-      /** 查询${functionName}列表 */
-      getList() {
-        this.loading = true;
-  #foreach ($column in $columns)
-      #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-        this.queryParams.params = {};
-          #break
-      #end
-  #end
-  #foreach ($column in $columns)
-      #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-          #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
-          this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
-          this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
-        }
-      #end
-  #end
-        list${BusinessName}(this.queryParams).then(response => {
-          this.${businessName}List = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        });
-      },
-      // 取消按钮
-      cancel() {
-        this.open = false;
-        this.reset();
-      },
-      // 表单重置
-      reset() {
-        this.form = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-        };
-          #if($table.sub)
-            this.${subclassName}List = [];
-          #end
-        this.resetForm("form");
-      },
-      /** 搜索按钮操作 */
-      handleQuery() {
-        this.queryParams.pageNum = 1;
-        this.getList();
-      },
-      /** 重置按钮操作 */
-      resetQuery() {
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                this.daterange${AttrName} = [];
-              #end
-          #end
-        this.resetForm("queryForm");
-        this.handleQuery();
-      },
-      // 多选框选中数据
-      handleSelectionChange(selection) {
-        this.ids = selection.map(item => item.${pkColumn.javaField})
-        this.single = selection.length!==1
-        this.multiple = !selection.length
-      },
-      /** 新增按钮操作 */
-      handleAdd() {
-        this.reset();
-        this.open = true;
-        this.title = "添加${functionName}";
-      },
-      /** 修改按钮操作 */
-      handleView(row) {
-        this.viewForm = row;
-        this.viewOpen = true;
-        this.viewTitle = "${functionName}详情";
-      },
-      /** 修改按钮操作 */
-      handleUpdate(row) {
-        this.reset();
-        const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
-        get${BusinessName}(${pkColumn.javaField}).then(response => {
-          this.form = response.data;
-            #foreach ($column in $columns)
-                #if($column.htmlType == "checkbox")
-                  this.form.$column.javaField = this.form.${column.javaField}.split(",");
-                #end
-            #end
-            #if($table.sub)
-              this.${subclassName}List = response.data.${subclassName}List;
-            #end
-          this.open = true;
-          this.title = "修改${functionName}";
-        });
-      },
-      /** 提交按钮 */
-      submitForm() {
-        this.#[[$]]#refs["form"].validate(valid => {
-          if (valid) {
-            #foreach ($column in $columns)
-            #if($column.htmlType == "checkbox")
-            this.form.$column.javaField = this.form.${column.javaField}.join(",");
-            #end
-            #end
-            #if($table.sub)
-            this.form.${subclassName}List = this.${subclassName}List;
-            #end
-            if (this.form.${pkColumn.javaField} != null) {
-              update${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("修改成功");
-                this.open = false;
-                this.getList();
-              });
-            } else {
-              add${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("新增成功");
-                this.open = false;
-                this.getList();
-              });
-            }
-          }
-        });
-      },
-      /** 删除按钮操作 */
-      handleDelete(row) {
-        const ${pkColumn.javaField}s = row.${pkColumn.javaField} || this.ids;
-        this.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + ${pkColumn.javaField}s + '"的数据项?').then(function() {
-          return del${BusinessName}(${pkColumn.javaField}s);
-        }).then(() => {
-          this.getList();
-          this.#[[$modal]]#.msgSuccess("删除成功");
-        }).catch(() => {});
-      },
-  #if($table.sub)
-  /** ${subTable.functionName}序号 */
-  row${subClassName}Index({ row, rowIndex }) {
-    row.index = rowIndex + 1;
-  },
-  /** ${subTable.functionName}添加按钮操作 */
-  handleAdd${subClassName}() {
-    let obj = {};
-    #foreach($column in $subTable.columns)
-    #if($column.pk || $column.javaField == ${subTableFkclassName})
-    #elseif($column.list && "" != $javaField)
-    obj.$column.javaField = "";
-    #end
-    #end
-    this.${subclassName}List.push(obj);
-  },
-  /** ${subTable.functionName}删除按钮操作 */
-  handleDelete${subClassName}() {
-    if (this.checked${subClassName}.length == 0) {
-      this.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
-    } else {
-      const ${subclassName}List = this.${subclassName}List;
-      const checked${subClassName} = this.checked${subClassName};
-      this.${subclassName}List = ${subclassName}List.filter(function(item) {
-        return checked${subClassName}.indexOf(item.index) == -1
-      });
-    }
-  },
-  /** 复选框选中数据 */
-  handle${subClassName}SelectionChange(selection) {
-    this.checked${subClassName} = selection.map(item => item.index)
-  },
-  #end
-      /** 导出按钮操作 */
-      handleExport() {
-        this.download('${moduleName}/${businessName}/export', {
-          ...this.queryParams
-        }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-      },
-      /** 导入按钮操作 */
-      handleImport() {
-        this.upload.title = "企业分类信息导入";
-        this.upload.open = true;
-      },
-      /** 下载模板操作 */
-      importTemplate() {
-        this.download('${moduleName}/${businessName}/importTemplate', {
-        }, `${businessName}_template.xlsx`)
-      },
-      // 文件上传中处理
-      handleFileUploadProgress(event, file, fileList) {
-        this.upload.isUploading = true;
-      },
-      // 文件上传成功处理
-      handleFileSuccess(response, file, fileList) {
-        this.upload.open = false;
-        this.upload.isUploading = false;
-        this.$refs.upload.clearFiles();
-        this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-        this.getList();
-      },
-      // 提交上传文件
-      submitFileForm() {
-        this.$refs.upload.submit();
-      }
-  }
-  };
-</script>

+ 0 - 474
wxjy-wxjy-service/src/main/resources/vm-xiong/vue/v3/index-tree.vue.vm

@@ -1,474 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-        #foreach($column in $columns)
-            #if($column.query)
-                #set($dictType=$column.dictType)
-                #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                #set($parentheseIndex=$column.columnComment.indexOf("("))
-                #if($parentheseIndex != -1)
-                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                #else
-                    #set($comment=$column.columnComment)
-                #end
-                #if($column.htmlType == "input")
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-input
-                        v-model="queryParams.${column.javaField}"
-                        placeholder="请输入${comment}"
-                        clearable
-                        @keyup.enter="handleQuery"
-                    />
-                  </el-form-item>
-                #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                      <el-option
-                          v-for="dict in ${dictType}"
-                          :key="dict.value"
-                          :label="dict.label"
-                          :value="dict.value"
-                      />
-                    </el-select>
-                  </el-form-item>
-                #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                      <el-option label="请选择字典生成" value="" />
-                    </el-select>
-                  </el-form-item>
-                #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-                  <el-form-item label="${comment}" prop="${column.javaField}">
-                    <el-date-picker clearable
-                                    v-model="queryParams.${column.javaField}"
-                                    type="date"
-                                    value-format="YYYY-MM-DD"
-                                    placeholder="选择${comment}">
-                    </el-date-picker>
-                  </el-form-item>
-                #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  <el-form-item label="${comment}" style="width: 308px">
-                    <el-date-picker
-                        v-model="daterange${AttrName}"
-                        value-format="YYYY-MM-DD"
-                        type="daterange"
-                        range-separator="-"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
-                    ></el-date-picker>
-                  </el-form-item>
-                #end
-            #end
-        #end
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="Plus"
-            @click="handleAdd"
-            v-hasPermi="['${moduleName}:${businessName}:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="info"
-            plain
-            icon="Sort"
-            @click="toggleExpandAll"
-        >展开/折叠</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table
-        v-if="refreshTable"
-        v-loading="loading"
-        :data="${businessName}List"
-        row-key="${treeCode}"
-        :default-expand-all="isExpandAll"
-        :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-    >
-        #foreach($column in $columns)
-            #set($javaField=$column.javaField)
-            #set($parentheseIndex=$column.columnComment.indexOf("("))
-            #if($parentheseIndex != -1)
-                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-            #else
-                #set($comment=$column.columnComment)
-            #end
-            #if($column.pk)
-            #elseif($column.list && $column.htmlType == "datetime")
-              <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-                <template #default="scope">
-                  <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-                </template>
-              </el-table-column>
-            #elseif($column.list && $column.htmlType == "imageUpload")
-              <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-                <template #default="scope">
-                  <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-                </template>
-              </el-table-column>
-            #elseif($column.list && "" != $column.dictType)
-              <el-table-column label="${comment}" align="center" prop="${javaField}">
-                <template #default="scope">
-                    #if($column.htmlType == "checkbox")
-                      <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-                    #else
-                      <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-                    #end
-                </template>
-              </el-table-column>
-            #elseif($column.list && "" != $javaField)
-                #if(${foreach.index} == 1)
-                  <el-table-column label="${comment}" prop="${javaField}" />
-                #else
-                  <el-table-column label="${comment}" align="center" prop="${javaField}" />
-                #end
-            #end
-        #end
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
-          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
-          #foreach($column in $columns)
-              #set($field=$column.javaField)
-              #if($column.insert && !$column.pk)
-                  #if(($column.usableColumn) || (!$column.superColumn))
-                      #set($parentheseIndex=$column.columnComment.indexOf("("))
-                      #if($parentheseIndex != -1)
-                          #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                      #else
-                          #set($comment=$column.columnComment)
-                      #end
-                      #set($dictType=$column.dictType)
-                      #if("" != $treeParentCode && $column.javaField == $treeParentCode)
-                        <el-form-item label="${comment}" prop="${treeParentCode}">
-                          <el-tree-select
-                              v-model="form.${treeParentCode}"
-                              :data="${businessName}Options"
-                              :props="{ value: '${treeCode}', label: '${treeName}', children: 'children' }"
-                              value-key="${treeCode}"
-                              placeholder="请选择${comment}"
-                              check-strictly
-                          />
-                        </el-form-item>
-                      #elseif($column.htmlType == "input")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-                        </el-form-item>
-                      #elseif($column.htmlType == "imageUpload")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <image-upload v-model="form.${field}"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "fileUpload")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <file-upload v-model="form.${field}"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "editor")
-                        <el-form-item label="${comment}">
-                          <editor v-model="form.${field}" :min-height="192"/>
-                        </el-form-item>
-                      #elseif($column.htmlType == "select" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                            <el-option
-                                v-for="dict in ${dictType}"
-                                :key="dict.value"
-                                :label="dict.label"
-                                #if($column.javaType == "Integer" || $column.javaType == "Long")
-                                :value="parseInt(dict.value)"
-                                #else
-                                :value="dict.value"
-                                #end
-                            ></el-option>
-                          </el-select>
-                        </el-form-item>
-                      #elseif($column.htmlType == "select" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                            <el-option label="请选择字典生成" value="" />
-                          </el-select>
-                        </el-form-item>
-                      #elseif($column.htmlType == "checkbox" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-checkbox-group v-model="form.${field}">
-                            <el-checkbox
-                                v-for="dict in ${dictType}"
-                                :key="dict.value"
-                                :label="dict.value">
-                              {{dict.label}}
-                            </el-checkbox>
-                          </el-checkbox-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "checkbox" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-checkbox-group v-model="form.${field}">
-                            <el-checkbox>请选择字典生成</el-checkbox>
-                          </el-checkbox-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "radio" && "" != $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-radio-group v-model="form.${field}">
-                            <el-radio
-                                v-for="dict in ${dictType}"
-                                :key="dict.value"
-                                #if($column.javaType == "Integer" || $column.javaType == "Long")
-                                :label="parseInt(dict.value)"
-                                #else
-                                :label="dict.value"
-                                #end
-                            >{{dict.label}}</el-radio>
-                          </el-radio-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "radio" && $dictType)
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-radio-group v-model="form.${field}">
-                            <el-radio label="1">请选择字典生成</el-radio>
-                          </el-radio-group>
-                        </el-form-item>
-                      #elseif($column.htmlType == "datetime")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-date-picker clearable
-                                          v-model="form.${field}"
-                                          type="date"
-                                          value-format="YYYY-MM-DD"
-                                          placeholder="选择${comment}">
-                          </el-date-picker>
-                        </el-form-item>
-                      #elseif($column.htmlType == "textarea")
-                        <el-form-item label="${comment}" prop="${field}">
-                          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
-                        </el-form-item>
-                      #end
-                  #end
-              #end
-          #end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}">
-  import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-
-  const { proxy } = getCurrentInstance();
-      #if(${dicts} != '')
-          #set($dictsNoSymbol=$dicts.replace("'", ""))
-      const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
-      #end
-
-  const ${businessName}List = ref([]);
-  const ${businessName}Options = ref([]);
-  const open = ref(false);
-  const loading = ref(true);
-  const showSearch = ref(true);
-  const title = ref("");
-  const isExpandAll = ref(true);
-  const refreshTable = ref(true);
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-          const daterange${AttrName} = ref([]);
-          #end
-      #end
-
-  const data = reactive({
-    form: {},
-    queryParams: {
-        #foreach ($column in $columns)
-            #if($column.query)
-                    $column.javaField: null#if($foreach.count != $columns.size()),#end
-            #end
-        #end
-    },
-    rules: {
-        #foreach ($column in $columns)
-            #if($column.required)
-                #set($parentheseIndex=$column.columnComment.indexOf("("))
-                #if($parentheseIndex != -1)
-                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                #else
-                    #set($comment=$column.columnComment)
-                #end
-                    $column.javaField: [
-                { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-              ]#if($foreach.count != $columns.size()),#end
-            #end
-        #end
-    }
-  });
-
-  const { queryParams, form, rules } = toRefs(data);
-
-  /** 查询${functionName}列表 */
-  function getList() {
-    loading.value = true;
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-            queryParams.value.params = {};
-              #break
-          #end
-      #end
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            if (null != daterange${AttrName} && '' != daterange${AttrName}) {
-              queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
-              queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
-            }
-          #end
-      #end
-    list${BusinessName}(queryParams.value).then(response => {
-            ${businessName}List.value = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-      loading.value = false;
-    });
-  }
-
-  /** 查询${functionName}下拉树结构 */
-  function getTreeselect() {
-    list${BusinessName}().then(response => {
-            ${businessName}Options.value = [];
-      const data = { ${treeCode}: 0, ${treeName}: '顶级节点', children: [] };
-      data.children = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-            ${businessName}Options.value.push(data);
-    });
-  }
-
-  // 取消按钮
-  function cancel() {
-    open.value = false;
-    reset();
-  }
-
-  // 表单重置
-  function reset() {
-    form.value = {
-        #foreach ($column in $columns)
-            #if($column.htmlType == "checkbox")
-                    $column.javaField: []#if($foreach.count != $columns.size()),#end
-            #else
-                    $column.javaField: null#if($foreach.count != $columns.size()),#end
-            #end
-        #end
-    };
-    proxy.resetForm("${businessName}Ref");
-  }
-
-  /** 搜索按钮操作 */
-  function handleQuery() {
-    getList();
-  }
-
-  /** 重置按钮操作 */
-  function resetQuery() {
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            daterange${AttrName}.value = [];
-          #end
-      #end
-    proxy.resetForm("queryRef");
-    handleQuery();
-  }
-
-  /** 新增按钮操作 */
-  function handleAdd(row) {
-    reset();
-    getTreeselect();
-    if (row != null && row.${treeCode}) {
-      form.value.${treeParentCode} = row.${treeCode};
-    } else {
-      form.value.${treeParentCode} = 0;
-    }
-    open.value = true;
-    title.value = "添加${functionName}";
-  }
-
-  /** 展开/折叠操作 */
-  function toggleExpandAll() {
-    refreshTable.value = false;
-    isExpandAll.value = !isExpandAll.value;
-    nextTick(() => {
-      refreshTable.value = true;
-    });
-  }
-
-  /** 修改按钮操作 */
-  async function handleUpdate(row) {
-    reset();
-    await getTreeselect();
-    if (row != null) {
-      form.value.${treeParentCode} = row.${treeParentCode};
-    }
-    get${BusinessName}(row.${pkColumn.javaField}).then(response => {
-      form.value = response.data;
-        #foreach ($column in $columns)
-            #if($column.htmlType == "checkbox")
-              form.value.$column.javaField = form.value.${column.javaField}.split(",");
-            #end
-        #end
-      open.value = true;
-      title.value = "修改${functionName}";
-    });
-  }
-
-  /** 提交按钮 */
-  function submitForm() {
-    proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
-      if (valid) {
-        #foreach ($column in $columns)
-        #if($column.htmlType == "checkbox")
-        form.value.$column.javaField = form.value.${column.javaField}.join(",");
-        #end
-        #end
-        if (form.value.${pkColumn.javaField} != null) {
-          update${BusinessName}(form.value).then(response => {
-            proxy.#[[$modal]]#.msgSuccess("修改成功");
-            open.value = false;
-            getList();
-          });
-        } else {
-          add${BusinessName}(form.value).then(response => {
-            proxy.#[[$modal]]#.msgSuccess("新增成功");
-            open.value = false;
-            getList();
-          });
-        }
-      }
-    });
-  }
-
-  /** 删除按钮操作 */
-  function handleDelete(row) {
-    proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?').then(function() {
-      return del${BusinessName}(row.${pkColumn.javaField});
-    }).then(() => {
-      getList();
-      proxy.#[[$modal]]#.msgSuccess("删除成功");
-    }).catch(() => {});
-  }
-
-  getList();
-</script>

+ 0 - 702
wxjy-wxjy-service/src/main/resources/vm-xiong/vue/v3/index.vue.vm

@@ -1,702 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-    #set($dictType=$column.dictType)
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-            v-model="queryParams.${column.javaField}"
-            placeholder="请输入${comment}"
-            clearable
-            @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-    #elseif($column.htmlType == "textarea")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-            v-model="queryParams.${column.javaField}"
-            placeholder="请输入${comment}"
-            clearable
-            @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-##        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-##          <el-option
-##              v-for="dict in ${dictType}"
-##              :key="dict.value"
-##              :label="dict.label"
-##              :value="dict.value"
-##          />
-##        </el-select>
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-##        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-##          <el-option label="请选择字典生成" value=""/>
-##        </el-select>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-                        v-model="queryParams.${column.javaField}"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择${comment}">
-        </el-date-picker>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}" style="width: 308px">
-        <el-date-picker
-            v-model="daterange${AttrName}"
-            value-format="YYYY-MM-DD"
-            type="daterange"
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-    #end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="Plus"
-            @click="handleAdd"
-##            v-hasPermi="['${moduleName}:${businessName}:add']"
-        >新增
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="success"
-            plain
-            icon="Edit"
-            :disabled="single"
-            @click="handleUpdate"
-##            v-hasPermi="['${moduleName}:${businessName}:edit']"
-        >修改
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="danger"
-            plain
-            icon="Delete"
-            :disabled="multiple"
-            @click="handleDelete"
-##            v-hasPermi="['${moduleName}:${businessName}:remove']"
-        >删除
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-##            v-hasPermi="['${moduleName}:${businessName}:export']"
-        >导出
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="info"
-            plain
-            icon="el-icon-upload2"
-            size="mini"
-            @click="handleImport"
-            v-hasPermi="['bus:${businessName}:import']"
-        >导入</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center"/>
-#foreach($column in $columns)
-    #set($javaField=$column.javaField)
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.pk)
-      <el-table-column label="${comment}" align="center" prop="${javaField}"/>
-    #elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-##                <template #default="scope">
-##                  <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-##                <template #default="scope">
-##                  <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && $column.htmlType == "input")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-      </el-table-column>
-    #elseif($column.htmlType == "textarea")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-      </el-table-column>
-    #elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-##                <template #default="scope">
-##                    #if($column.htmlType == "checkbox")
-##                      <dict-tag :options="${column.dictType}"
-##                                :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-##                    #else
-##                      <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-##                    #end
-##                </template>
-      </el-table-column>
-    #elseif($column.list && "" != $javaField)
-      <el-table-column label="${comment}" align="center" prop="${javaField}"/>
-    #else
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-      </el-table-column>
-    #end
-#end
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
-##                     v-hasPermi="['${moduleName}:${businessName}:edit']">修改
-          </el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
-##                     v-hasPermi="['${moduleName}:${businessName}:remove']">删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-        v-show="total>0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-    />
-
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-  #set($field=$column.javaField)
-  #if($column.insert && !$column.pk)
-      #if(($column.usableColumn) || (!$column.superColumn))
-          #set($parentheseIndex=$column.columnComment.indexOf("("))
-          #if($parentheseIndex != -1)
-              #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-          #else
-              #set($comment=$column.columnComment)
-          #end
-          #set($dictType=$column.dictType)
-          #if($column.htmlType == "input")
-            <el-form-item label="${comment}" prop="${field}">
-              <el-input v-model="form.${field}" placeholder="请输入${comment}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "imageUpload")
-            <el-form-item label="${comment}" prop="${field}">
-              <image-upload v-model="form.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "fileUpload")
-            <el-form-item label="${comment}" prop="${field}">
-              <file-upload v-model="form.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "editor")
-            <el-form-item label="${comment}">
-              <editor v-model="form.${field}" :min-height="192"/>
-            </el-form-item>
-          #elseif($column.htmlType == "select" && "" != $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-##              <el-select v-model="form.${field}" placeholder="请选择${comment}">
-##                <el-option
-##                    v-for="dict in ${dictType}"
-##                    :key="dict.value"
-##                    :label="dict.label"
-##                    #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                    :value="parseInt(dict.value)"
-##                    #else
-##                    :value="dict.value"
-##                    #end
-##                ></el-option>
-##              </el-select>
-            </el-form-item>
-          #elseif($column.htmlType == "select" && $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-##              <el-select v-model="form.${field}" placeholder="请选择${comment}">
-##                <el-option label="请选择字典生成" value=""/>
-##              </el-select>
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && "" != $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-##              <el-checkbox-group v-model="form.${field}">
-##                <el-checkbox
-##                    v-for="dict in ${dictType}"
-##                    :key="dict.value"
-##                    :label="dict.value">
-##                  {{dict.label}}
-##                </el-checkbox>
-##              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-              <el-checkbox-group v-model="form.${field}">
-                <el-checkbox>请选择字典生成</el-checkbox>
-              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && "" != $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-##              <el-radio-group v-model="form.${field}">
-##                <el-radio
-##                    v-for="dict in ${dictType}"
-##                    :key="dict.value"
-##                    #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                    :label="parseInt(dict.value)"
-##                    #else
-##                    :label="dict.value"
-##                    #end
-##                >{{dict.label}}
-##                </el-radio>
-##              </el-radio-group>
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && $dictType)
-            <el-form-item label="${comment}" prop="${field}">
-              <el-radio-group v-model="form.${field}">
-                <el-radio label="1">请选择字典生成</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          #elseif($column.htmlType == "datetime")
-            <el-form-item label="${comment}" prop="${field}">
-              <el-date-picker clearable
-                              v-model="form.${field}"
-                              type="date"
-                              value-format="YYYY-MM-DD"
-                              placeholder="请选择${comment}">
-              </el-date-picker>
-            </el-form-item>
-          #elseif($column.htmlType == "textarea")
-            <el-form-item label="${comment}" prop="${field}">
-              <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容"/>
-            </el-form-item>
-          #end
-      #end
-  #end
-#end
-      #if($table.sub)
-        <el-divider content-position="center">${subTable.functionName}信息</el-divider>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
-          </el-col>
-        </el-row>
-        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index"
-                  @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-          <el-table-column type="selection" width="50" align="center"/>
-          <el-table-column label="序号" align="center" prop="index" width="50"/>
-            #foreach($column in $subTable.columns)
-                #set($javaField=$column.javaField)
-                #set($parentheseIndex=$column.columnComment.indexOf("("))
-                #if($parentheseIndex != -1)
-                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                #else
-                    #set($comment=$column.columnComment)
-                #end
-                #if($column.pk || $javaField == ${subTableFkclassName})
-                #elseif($column.list && $column.htmlType == "input")
-                  <el-table-column label="$comment" prop="${javaField}" width="150">
-                    <template #default="scope">
-                      <el-input v-model="scope.row.$javaField" placeholder="请输入$comment"/>
-                    </template>
-                  </el-table-column>
-                #elseif($column.list && $column.htmlType == "datetime")
-                  <el-table-column label="$comment" prop="${javaField}" width="240">
-                    <template #default="scope">
-                      <el-date-picker clearable
-                                      v-model="scope.row.$javaField"
-                                      type="date"
-                                      value-format="YYYY-MM-DD"
-                                      placeholder="请选择$comment">
-                      </el-date-picker>
-                    </template>
-                  </el-table-column>
-                #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") &&
-                    "" != $column.dictType)
-                  <el-table-column label="$comment" prop="${javaField}" width="150">
-##                    <template #default="scope">
-##                      <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-##                        <el-option
-##                            v-for="dict in $column.dictType"
-##                            :key="dict.value"
-##                            :label="dict.label"
-##                            :value="dict.value"
-##                        ></el-option>
-##                      </el-select>
-##                    </template>
-                  </el-table-column>
-                #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") &&
-                    "" == $column.dictType)
-                  <el-table-column label="$comment" prop="${javaField}" width="150">
-##                    <template #default="scope">
-##                      <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-##                        <el-option label="请选择字典生成" value=""/>
-##                      </el-select>
-##                    </template>
-                  </el-table-column>
-                #end
-            #end
-        </el-table>
-      #end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 导入对话框 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-          ref="upload"
-          :limit="1"
-          accept=".xlsx, .xls"
-          :headers="upload.headers"
-          :action="upload.url + '?updateSupport=' + upload.updateSupport"
-          :disabled="upload.isUploading"
-          :on-progress="handleFileUploadProgress"
-          :on-success="handleFileSuccess"
-          :auto-upload="false"
-          drag
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据
-          </div>
-          <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
-        </div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">确 定</el-button>
-        <el-button @click="upload.open = false">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}">
-import {get${BusinessName}, list${BusinessName}} from "@/api/";
-
-const {proxy} = getCurrentInstance();
-#if(${dicts} != '')
-  #set($dictsNoSymbol=$dicts.replace("'", ""))
-const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
-#end
-
-const ${businessName}List = ref([]);
-#if($table.sub)
-const ${subclassName}List = ref([]);
-#end
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-#if($table.sub)
-const checked${subClassName} = ref([]);
-#end
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-const daterange${AttrName} = ref([]);
-#end
-#end
-
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    #foreach ($column in $columns)
-#if($column.query)
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  },
-  rules: {
-    #foreach ($column in $columns)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-    $column.javaField: [
-      { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-    ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-  },
-  // ${functionName}导入参数
-  upload: {
-    // 是否显示弹出层(${functionName}导入)
-    open: false,
-    // 弹出层标题(${functionName}导入)
-    title: "",
-    // 是否禁用上传
-    isUploading: false,
-    // 是否更新已经存在的${functionName}数据
-    updateSupport: 0,
-    // 设置上传的请求头部
-    headers: { Authorization: "Bearer " + getToken() },
-    // 上传的地址
-    url: process.env.VUE_APP_BASE_API + "/${moduleName}/${businessName}/importData"
-  },
-});
-
-    const { queryParams, form, rules } = toRefs(data);
-
-    /** 查询${functionName}列表 */
-    function getList() {
-      loading.value = true;
-    #foreach ($column in $columns)
-    #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      queryParams.value.params = {};
-    #break
-    #end
-    #end
-    #foreach ($column in $columns)
-    #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      if (null != daterange${AttrName} && '' != daterange${AttrName}) {
-        queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
-        queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
-      }
-    #end
-    #end
-      list${BusinessName}(queryParams.value).then(response => {
-        ${businessName}List.value = response.rows;
-        total.value = response.total;
-        loading.value = false;
-      });
-    }
-
-    // 取消按钮
-    function cancel() {
-      open.value = false;
-      reset();
-    }
-
-    // 表单重置
-    function reset() {
-      form.value = {
-    #foreach ($column in $columns)
-    #if($column.htmlType == "checkbox")
-        $column.javaField: []#if($foreach.count != $columns.size()),#end
-    #else
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-    #end
-    #end
-      };
-    #if($table.sub)
-      ${subclassName}List.value = [];
-    #end
-      proxy.resetForm("${businessName}Ref");
-    }
-
-    /** 搜索按钮操作 */
-    function handleQuery() {
-      queryParams.value.pageNum = 1;
-      getList();
-    }
-
-    /** 重置按钮操作 */
-    function resetQuery() {
-    #foreach ($column in $columns)
-    #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      daterange${AttrName}.value = [];
-    #end
-    #end
-      proxy.resetForm("queryRef");
-      handleQuery();
-    }
-
-    // 多选框选中数据
-    function handleSelectionChange(selection) {
-      ids.value = selection.map(item => item.${pkColumn.javaField});
-      single.value = selection.length != 1;
-      multiple.value = !selection.length;
-    }
-
-    /** 新增按钮操作 */
-    function handleAdd() {
-      reset();
-      open.value = true;
-      title.value = "添加${functionName}";
-    }
-
-    /** 修改按钮操作 */
-    function handleUpdate(row) {
-      reset();
-      const _${pkColumn.javaField} = row.${pkColumn.javaField} || ids.value
-      get${BusinessName}(_${pkColumn.javaField}).then(response => {
-        form.value = response.data;
-    #foreach ($column in $columns)
-    #if($column.htmlType == "checkbox")
-        form.value.$column.javaField = form.value.${column.javaField}.split(",");
-    #end
-    #end
-    #if($table.sub)
-        ${subclassName}List.value = response.data.${subclassName}List;
-    #end
-        open.value = true;
-        title.value = "修改${functionName}";
-      });
-    }
-
-    /** 提交按钮 */
-    function submitForm() {
-      proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
-        if (valid) {
-    #foreach ($column in $columns)
-    #if($column.htmlType == "checkbox")
-          form.value.$column.javaField = form.value.${column.javaField}.join(",");
-    #end
-    #end
-    #if($table.sub)
-          form.value.${subclassName}List = ${subclassName}List.value;
-    #end
-          if (form.value.${pkColumn.javaField} != null) {
-            update${BusinessName}(form.value).then(response => {
-              proxy.#[[$modal]]#.msgSuccess("修改成功");
-              open.value = false;
-              getList();
-            });
-          } else {
-            add${BusinessName}(form.value).then(response => {
-              proxy.#[[$modal]]#.msgSuccess("新增成功");
-              open.value = false;
-              getList();
-            });
-          }
-        }
-      });
-    }
-
-    /** 删除按钮操作 */
-    function handleDelete(row) {
-      const _${pkColumn.javaField}s = row.${pkColumn.javaField} || ids.value;
-      proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').then(function() {
-        return del${BusinessName}(_${pkColumn.javaField}s);
-      }).then(() => {
-        getList();
-        proxy.#[[$modal]]#.msgSuccess("删除成功");
-      }).catch(() => {});
-    }
-
-    #if($table.sub)
-    /** ${subTable.functionName}序号 */
-    function row${subClassName}Index({ row, rowIndex }) {
-      row.index = rowIndex + 1;
-    }
-
-    /** ${subTable.functionName}添加按钮操作 */
-    function handleAdd${subClassName}() {
-      let obj = {};
-    #foreach($column in $subTable.columns)
-    #if($column.pk || $column.javaField == ${subTableFkclassName})
-    #elseif($column.list && "" != $javaField)
-      obj.$column.javaField = "";
-    #end
-    #end
-      ${subclassName}List.value.push(obj);
-    }
-
-    /** ${subTable.functionName}删除按钮操作 */
-    function handleDelete${subClassName}() {
-      if (checked${subClassName}.value.length == 0) {
-        proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
-      } else {
-        const ${subclassName}s = ${subclassName}List.value;
-        const checked${subClassName}s = checked${subClassName}.value;
-        ${subclassName}List.value = ${subclassName}s.filter(function(item) {
-          return checked${subClassName}s.indexOf(item.index) == -1
-        });
-      }
-    }
-
-    /** 复选框选中数据 */
-    function handle${subClassName}SelectionChange(selection) {
-      checked${subClassName}.value = selection.map(item => item.index)
-    }
-
-    #end
-    /** 导出按钮操作 */
-    function handleExport() {
-      proxy.download('${moduleName}/${businessName}/export', {
-        ...queryParams.value
-      }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-    }
-
-    /** 导入按钮操作 */
-    handleImport() {
-      this.upload.title = "企业分类信息导入";
-      this.upload.open = true;
-    },
-    /** 下载模板操作 */
-    importTemplate() {
-      this.download('${moduleName}/${businessName}/importTemplate', {
-      }, `${businessName}_template.xlsx`)
-    },
-    // 文件上传中处理
-    handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
-    },
-    // 文件上传成功处理
-    handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-      this.getList();
-    },
-    // 提交上传文件
-    submitFileForm() {
-      this.$refs.upload.submit();
-    }
-    getList();
-</script>

+ 93 - 80
wxjy-wxjy-service/src/main/resources/vm/java/controller.java.vm

@@ -1,15 +1,26 @@
 package ${packageName}.controller;
 
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
 import cn.gov.customs.cacp.sdks.core.result.Result;
-import com.github.pagehelper.PageInfo;
-import org.springframework.web.bind.annotation.*;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.cacp.sdks.core.user.trans.UserContextHolder;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
-##import java.util.List;
-
-import ${packageName}.domain.${ClassName};
-import ${packageName}.domain.${ClassName}Query;
+import org.springframework.web.bind.annotation.*;
+import cn.gov.customs.wxjy.common.core.controller.BaseController;
+import org.springframework.web.multipart.MultipartFile;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import ${packageName}.pojo.${ClassName};
+import ${packageName}.pojo.${ClassName}Query;
 import ${packageName}.service.I${ClassName}Service;
-##import cn.gov.customs.zhsj.common.utils.poi.ExcelUtil;
+import cn.gov.customs.wxjy.common.utils.poi.ExcelUtil;
+#if($table.crud || $table.sub)
+import cn.gov.customs.wxjy.common.core.page.TableDataInfo;
+#elseif($table.tree)
+#end
 
 /**
  * ${functionName}Controller
@@ -20,7 +31,7 @@ import ${packageName}.service.I${ClassName}Service;
 @RestController
 @RequestMapping("/${moduleName}/${businessName}")
 @RequiredArgsConstructor
-public class ${ClassName}Controller {
+public class ${ClassName}Controller extends BaseController {
 
     private final I${ClassName}Service ${className}Service;
 
@@ -28,85 +39,87 @@ public class ${ClassName}Controller {
      * 查询${functionName}列表
      */
     @PostMapping("/get-list")
-    public Result<PageInfo<${ClassName}>> getPageList(@RequestBody ${ClassName}Query query) {
-        PageInfo<${ClassName}> list = ${className}Service.getPageList(query);
+    #if($table.crud || $table.sub)
+    public Result<PageInfo<${ClassName}>> list(@RequestBody ${ClassName}Query query) {
+        PageHelper.startPage(query.getPageIndex(), query.getPageSize());
+        PageInfo<${ClassName}> list = ${className}Service.selectPageList(query);
         return Result.success(list);
     }
+    #elseif($table.tree)
+        public Result<PageInfo<${ClassName}>> list(${ClassName}Query query) {
+            PageInfo<${ClassName}> list = ${className}Service.selectList(${className});
+            return Result.success(list);
+        }
+    #end
 
     /**
      * 获取${functionName}详细信息
      */
     @GetMapping(value = "/get-detail")
-    public Result<${ClassName}> getDetail(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) {
-        ${ClassName} detail = ${className}Service.getDetail(${pkColumn.javaField});
-        return Result.success(detail);
+    public Result<${ClassName}> getInfo(@RequestParam ${pkColumn.javaType} ${pkColumn.javaField}) {
+        return Result.success(${className}Service.selectBy${pkColumn.capJavaField}(${pkColumn.javaField}));
+    }
+
+    /**
+     * 新增${functionName}
+     */
+    @PostMapping("/insert-${className}")
+    public Result<Integer> add(@RequestBody ${ClassName} ${className}) {
+        return Result.success(${className}Service.insert(${className}));
+    }
+
+    /**
+     * 修改${functionName}
+     */
+    @PostMapping("/update-${className}")
+    public Result<Integer> edit(@RequestBody ${ClassName} ${className}) {
+##        ${className}.setUpdateBy(getUserId().toString());
+        return Result.success(${className}Service.update(${className}));
     }
 
-##    /**
-##     * 导出${functionName}列表
-##     */
-##    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
-##    @PostMapping("/export")
-##    public void export(HttpServletResponse response, ${ClassName} ${className}) {
-##        List<${ClassName}> list = ${className}Service.selectList(${className});
-##        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class);
-##        util.exportExcel(response, list, "${functionName}数据");
-##    }
-##    /**
-##     * 新增${functionName}
-##     */
-##    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
-##    @PostMapping
-##    public AjaxResult add(@RequestBody ${ClassName} ${className}) {
-##       #* ${className}.setCreateBy(getUserId().toString());
-##        ${className}.setDeptId(getDeptId());
-##        if(StringUtils.isEmpty(${className}.getCustomsCode())){
-##            ${className}.setCustomsCode(busCache.getOrgDeptById(getDeptId()).getCustomsCode());
-##        }*#
-##        return toAjax(${className}Service.insert(${className}));
-##    }
-##    /**
-##     * 修改${functionName}
-##     */
-##    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
-##    @PutMapping
-##    public AjaxResult edit(@RequestBody ${ClassName} ${className}) {
-####        ${className}.setUpdateBy(getUserId().toString());
-##        return toAjax(${className}Service.update(${className}));
-##    }
-##    /**
-##     * 删除${functionName}
-##     */
-##    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
-##    @DeleteMapping("/{${pkColumn.javaField}s}")
-##    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) {
-##        return toAjax(${className}Service.deleteBy${pkColumn.capJavaField}s(${pkColumn.javaField}s));
-##    }
-##    /**
-##    * 获取导入模板
-##    * @param response
-##    */
-##    @PostMapping("/importTemplate")
-##    public void importTemplate(HttpServletResponse response)
-##    {
-##        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-##        util.importTemplateExcel(response, "${functionName}");
-##    }
-##    /**
-##    * 导入 ${functionName}
-##    * @param file
-##    * @param updateSupport
-##    * @return
-##    * @throws Exception
-##    */
-##    @Log(title = "${functionName}", businessType = BusinessType.IMPORT)
-##    @PostMapping("/importData")
-##    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-##    {
-##        CacpTransUser user = UserContextHolder.currentUser();
-##        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-##        List<${ClassName}> ${className}List = util.importExcel(file.getInputStream());
-##        String message = ${className}Service.import${ClassName}(${className}List, updateSupport, user);
-##        return success(message);
-##    }
+    /**
+     * 删除${functionName}
+     */
+    @PostMapping("/delete-${className}")
+    public Result<Integer> remove(@PathVariable ${pkColumn.javaType}[] ids) {
+        return Result.success(${className}Service.deleteBy${pkColumn.capJavaField}s(ids));
+    }
+
+    /**
+    * 导入 ${functionName}
+    * @param file
+    * @param updateSupport
+    * @return
+    * @throws Exception
+    */
+    @PostMapping("/import-${className}")
+    public Result<String> importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        CacpTransUser user = UserContextHolder.currentUser();
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+        List<${ClassName}> ${className}List = util.importExcel(file.getInputStream());
+        String message = ${className}Service.import${ClassName}(${className}List, updateSupport, user);
+        return Result.success(message);
+    }
+
+    /**
+     * 导出${functionName}列表
+     */
+    @PostMapping("/get-${className}-export")
+    public void export(HttpServletResponse response, @RequestBody ${ClassName}Query query) {
+        List<${ClassName}> list = ${className}Service.selectList(query);
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class);
+        util.exportExcel(response, list, "${functionName}数据");
+    }
+
+    /**
+    * 获取导入模板
+    * @param response
+    */
+    @PostMapping("/template-${className}")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+        util.importTemplateExcel(response, "${functionName}");
+    }
 }

+ 2 - 1
wxjy-wxjy-service/src/main/resources/vm-xiong/java/dao.java.vm → wxjy-wxjy-service/src/main/resources/vm/java/dao.java.vm

@@ -4,6 +4,7 @@ import java.util.List;
 
 import org.apache.ibatis.annotations.Mapper;
 import ${packageName}.pojo.${ClassName};
+import ${packageName}.pojo.${ClassName}Query;
 #if($table.sub)
 import ${packageName}.pojo.${subClassName};
 #end
@@ -30,7 +31,7 @@ public interface ${ClassName}Mapper {
      * @param ${className} ${functionName}
      * @return ${functionName}集合
      */
-    public List<${ClassName}> selectList(${ClassName} ${className});
+    public List<${ClassName}> selectList(${ClassName}Query ${className});
 
     /**
      * 新增${functionName}

+ 0 - 124
wxjy-wxjy-service/src/main/resources/vm/java/domain.java.vm

@@ -1,124 +0,0 @@
-package ${packageName}.domain;
-
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-#foreach ($import in $importList)
-import ${import};
-#end
-import lombok.Data;
-import cn.gov.customs.zhsj.common.annotation.Excel;
-#if($table.crud || $table.sub)
-import cn.gov.customs.zhsj.common.core.domain.BasicEntity;
-#elseif($table.tree)
-import cn.gov.customs.zhsj.common.core.domain.TreeEntity;
-#end
-
-/**
- * ${functionName}对象 ${tableName}
- *
- * @author ${author}
- * @date ${datetime}
- */
-#if($table.crud || $table.sub)
-    #set($Entity="BasicEntity")
-#elseif($table.tree)
-    #set($Entity="TreeEntity")
-#end
-@Data
-public class ${ClassName} extends ${Entity} {
-private static final long serialVersionUID = 1L;
-
-#foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
-    /** $column.columnComment */
-    #set($isCamelCase = false)
-    #foreach ($c in $column.javaField.toCharArray())
-        #if ($c.isUpperCase())
-            #set($isCamelCase = true)
-        #end
-    #end
-    #if (!$isCamelCase)
-        #set($processedField = ${column.javaField.toLowerCase()})
-    #end
-    #if($column.list)
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($parentheseIndex != -1)
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    #elseif($column.javaType == 'Date')
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-    #elseif($column.javaType == 'DateTime')
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    #elseif($column.javaType == 'Long')
-    @JsonSerialize(using= ToStringSerializer.class)
-    @Excel(name = "${comment}")
-    #else
-    @Excel(name = "${comment}")
-    #end
-##    #elseif($column.columnName == 'id')
-    #elseif($column.columnName.length()>= 2 && $column.columnName.substring(0, 2).toUpperCase() == 'PK')
-    @JsonSerialize(using= ToStringSerializer.class)
-    #end
-    private $column.javaType $column.javaField;
-
-    #end
-#end
-#if($table.sub)
-    /** $table.subTable.functionName信息 */
-    private List<${subClassName}> ${subclassName}List;
-
-#end
-###foreach ($column in $columns)
-##    #if(!$table.isSuperColumn($column.javaField))
-##        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-##            #set($AttrName=$column.javaField)
-##        #else
-##            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-##        #end
-##    public void set${AttrName}($column.javaType $column.javaField)
-##            {
-##            this.$column.javaField = $column.javaField;
-##            }
-##
-##    public $column.javaType get${AttrName}()
-##            {
-##            return $column.javaField;
-##            }
-##    #end
-###end
-##
-###if($table.sub)
-##public List<${subClassName}> get${subClassName}List()
-##        {
-##        return ${subclassName}List;
-##        }
-##
-##public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
-##        {
-##        this.${subclassName}List = ${subclassName}List;
-##        }
-##
-###end
-##@Override
-##public String toString() {
-##        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-##    #foreach ($column in $columns)
-##        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-##            #set($AttrName=$column.javaField)
-##        #else
-##            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-##        #end
-##            .append("${column.javaField}", get${AttrName}())
-##    #end
-##    #if($table.sub)
-##            .append("${subclassName}List", get${subClassName}List())
-##    #end
-##        .toString();
-##    }
-}

+ 0 - 17
wxjy-wxjy-service/src/main/resources/vm/java/domainQuery.java.vm

@@ -1,17 +0,0 @@
-package ${packageName}.domain;
-
-import lombok.Data;
-import java.io.Serializable;
-
-/**
- * ${functionName}对象 ${tableName}
- *
- * @author ${author}
- * @date ${datetime}
- */
-@Data
-public class ${ClassName}Query implements Serializable {
-
-    private int pageIndex;
-    private int pageSize;
-}

+ 0 - 101
wxjy-wxjy-service/src/main/resources/vm/java/mapper.java.vm

@@ -1,101 +0,0 @@
-package ${packageName}.mapper;
-
-import java.util.List;
-
-import org.apache.ibatis.annotations.Mapper;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.domain.${ClassName}Query;
-#if($table.sub)
-import ${packageName}.domain.${subClassName};
-#end
-
-/**
- * ${functionName}Mapper接口
- *
- * @author ${author}
- * @date ${datetime}
- */
-@Mapper
-public interface ${ClassName}Mapper {
-    /**
-     * 查询${functionName}
-     *
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    public ${ClassName} getDetail(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 查询${functionName}列表
-     *
-     * @return ${functionName}集合
-     */
-    public List<${ClassName}> getPageList(${ClassName}Query query);
-
-##    /**
-##     * 新增${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##    public int insert(${ClassName} ${className});
-##
-##    /**
-##     * 修改${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##    public int update(${ClassName} ${className});
-##
-##    /**
-##     * 删除${functionName}
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-##
-##    /**
-##     * 批量删除${functionName}
-##     *
-##     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
-##     * @return 结果
-##     */
-##    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-##    #if($table.sub)
-##
-##    /**
-##     * 批量删除${subTable.functionName}
-##     *
-##     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
-##     * @return 结果
-##     */
-##    public int deleteBy${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-##
-##    /**
-##     * 批量新增${subTable.functionName}
-##     *
-##     * @param ${subclassName}List ${subTable.functionName}列表
-##     * @return 结果
-##     */
-##    public int batch(List<${subClassName}> ${subclassName}List);
-##
-##
-##    /**
-##     * 通过${functionName}主键删除${subTable.functionName}信息
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}ID
-##     * @return 结果
-##     */
-##    public int deleteBy${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
-##    #end
-##
-##    /**
-##     * 逻辑删除${functionName}
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField});
-}

+ 3 - 3
wxjy-wxjy-service/src/main/resources/vm-xiong/java/pojo.java.vm → wxjy-wxjy-service/src/main/resources/vm/java/pojo.java.vm

@@ -6,11 +6,11 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import ${import};
 #end
 import lombok.Data;
-import cn.gov.customs.zhsj.common.annotation.Excel;
+import cn.gov.customs.wxjy.common.annotation.Excel;
 #if($table.crud || $table.sub)
-import cn.gov.customs.zhsj.common.core.domain.BaseEntity;
+import cn.gov.customs.wxjy.common.core.domain.BaseEntity;
 #elseif($table.tree)
-import cn.gov.customs.zhsj.common.core.domain.TreeEntity;
+import cn.gov.customs.wxjy.common.core.domain.TreeEntity;
 #end
 
 /**

+ 65 - 0
wxjy-wxjy-service/src/main/resources/vm/java/pojoQuery.java.vm

@@ -0,0 +1,65 @@
+package ${packageName}.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * ${functionName}对象 ${tableName}
+ *
+ * @author ${author}
+ * @date ${datetime}
+ */
+@Data
+public class ${ClassName}Query implements Serializable {
+
+    #foreach ($column in $columns)
+        #if(!$table.isSuperColumn($column.javaField))
+    /** $column.columnComment */
+            #set($isCamelCase = false)
+            #foreach ($c in $column.javaField.toCharArray())
+                #if ($c.isUpperCase())
+                    #set($isCamelCase = true)
+                #end
+            #end
+            #if (!$isCamelCase)
+                #set($processedField = ${column.javaField.toLowerCase()})
+            #end
+            #if($column.list)
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+                #if($parentheseIndex != -1)
+                #elseif($column.javaType == 'Date')
+                @JsonFormat(pattern = "yyyy-MM-dd")
+                #elseif($column.javaType == 'DateTime')
+                @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+                #elseif($column.javaType == 'Long')
+                @JsonSerialize(using= ToStringSerializer.class)
+                #else
+                #end
+                ##    #elseif($column.columnName == 'id')
+            #elseif($column.columnName.length()>= 2 && $column.columnName.substring(0, 2).toUpperCase() == 'PK')
+            @JsonSerialize(using= ToStringSerializer.class)
+            #end
+    private $column.javaType $column.javaField;
+
+        #end
+    #end
+    #if($table.sub)
+        /** $table.subTable.functionName信息 */
+    private List<${subClassName}> ${subclassName}List;
+
+    #end
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+    private int pageIndex;
+    private int pageSize;
+}

+ 64 - 55
wxjy-wxjy-service/src/main/resources/vm/java/service.java.vm

@@ -1,9 +1,10 @@
 package ${packageName}.service;
+
+import java.util.List;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import ${packageName}.pojo.${ClassName};
+import ${packageName}.pojo.${ClassName}Query;
 import com.github.pagehelper.PageInfo;
-##import java.util.List;
-##import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.domain.${ClassName}Query;
 
 /**
  * ${functionName}Service接口
@@ -18,63 +19,71 @@ public interface I${ClassName}Service {
      * @param ${pkColumn.javaField} ${functionName}主键
      * @return ${functionName}
      */
-    public ${ClassName} getDetail(${pkColumn.javaType} ${pkColumn.javaField});
+    public ${ClassName} selectBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 分页查询${functionName}列表
+     *
+     * @param query
+     * @return ${functionName}集合
+     */
+    public PageInfo<${ClassName}> selectPageList(${ClassName}Query query);
 
     /**
      * 查询${functionName}列表
      *
+     * @param query
      * @return ${functionName}集合
      */
-    public PageInfo<${ClassName}> getPageList(${ClassName}Query query);
+    public List<${ClassName}> selectList(${ClassName}Query query);
+
+    /**
+     * 新增${functionName}
+     *
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int insert(${ClassName} ${className});
+
+    /**
+     * 修改${functionName}
+     *
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int update(${ClassName} ${className});
+
+    /**
+     * 批量删除${functionName}
+     *
+     * @param ids 需要删除的ids主键集合
+     * @return 结果
+     */
+    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ids);
 
-##    /**
-##     * 新增${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##    public int insert(${ClassName} ${className});
-##
-##    /**
-##     * 修改${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##    public int update(${ClassName} ${className});
-##
-##    /**
-##     * 批量删除${functionName}
-##     *
-##     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
-##     * @return 结果
-##     */
-##    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-##
-##    /**
-##     * 删除${functionName}信息
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-##
-##    /**
-##     * 逻辑删除${functionName}信息
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField});
-##
-##    /**
-##     * 导入${functionName}数据
-##     *
-##     * @param ${className}List ${functionName}数据列表
-##     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-##     * @param cacpTransUser 操作用户
-##     * @return 结果
-##     */
-##    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser);
+    /**
+     * 删除${functionName}信息
+     *
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
 
+    /**
+     * 逻辑删除${functionName}信息
+     *
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 导入${functionName}数据
+     *
+     * @param ${className}List ${functionName}数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser);
 }

+ 197 - 213
wxjy-wxjy-service/src/main/resources/vm/java/serviceImpl.java.vm

@@ -1,38 +1,32 @@
 package ${packageName}.service.impl;
 
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
+import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
+import cn.gov.customs.wxjy.common.exception.ServiceException;
+import cn.gov.customs.wxjy.common.utils.StringUtils;
+import cn.gov.customs.wxjy.common.utils.bean.BeanValidators;
+import cn.gov.customs.wxjy.common.utils.uuid.SnowflakeIdWorker;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.validation.Validator;
 import java.util.List;
-import ${packageName}.mapper.${ClassName}Mapper;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.domain.${ClassName}Query;
+import org.apache.commons.collections4.CollectionUtils;
+import cn.gov.customs.wxjy.common.utils.DateUtils;
+import com.github.pagehelper.PageInfo;
+#foreach ($column in $columns)
+        #if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
+import cn.gov.customs.wxjy.common.utils.DateUtils;
+            #break
+        #end
+    #end
+#if($table.sub)
+import ${packageName}.pojo.${subClassName};
+    #end
+import ${packageName}.dao.${ClassName}Mapper;
+import ${packageName}.pojo.${ClassName};
+import ${packageName}.pojo.${ClassName}Query;
 import ${packageName}.service.I${ClassName}Service;
 
-##import cn.gov.customs.cacp.sdks.core.user.trans.CacpTransUser;
-##import cn.gov.customs.zhsj.common.exception.ServiceException;
-##import cn.gov.customs.zhsj.common.utils.StringUtils;
-##import cn.gov.customs.zhsj.common.utils.bean.BeanValidators;
-##import cn.gov.customs.zhsj.common.utils.uuid.SnowflakeIdWorker;
-##import lombok.RequiredArgsConstructor;
-##import lombok.extern.slf4j.Slf4j;
-##import org.springframework.stereotype.Service;
-##import javax.validation.Validator;
-##import org.apache.commons.collections4.CollectionUtils;
-##import cn.gov.customs.zhsj.common.utils.DateUtils;
-###foreach ($column in $columns)
-##        #if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
-##import cn.gov.customs.zhsj.common.utils.DateUtils;
-##            #break
-##        #end
-##    #end
-###if($table.sub)
-##import ${packageName}.domain.${subClassName};
-##    #end
-
-
 /**
  * ${functionName}Service业务层处理
  *
@@ -46,7 +40,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 
     private final ${ClassName}Mapper ${className}Mapper;
 
-##    private final Validator validator;
+    private final Validator validator;
 
     /**
      * 查询${functionName}
@@ -55,200 +49,190 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
      * @return ${functionName}
      */
     @Override
-    public ${ClassName} getDetail(${pkColumn.javaType} ${pkColumn.javaField}) {
-        ${ClassName} detail = ${className}Mapper.getDetail(${pkColumn.javaField});
-        return detail;
+    public ${ClassName} selectBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
+        return ${className}Mapper.selectBy${pkColumn.capJavaField}(${pkColumn.javaField});
+    }
+
+    /**
+     * 分页查询${functionName}列表
+     *
+     * @param query
+     * @return ${functionName}
+     */
+    @Override
+    public PageInfo<${ClassName}> selectPageList(${ClassName}Query query) {
+        return PageInfo.of(${className}Mapper.selectList(query));
     }
 
     /**
      * 查询${functionName}列表
      *
+     * @param query
      * @return ${functionName}
      */
     @Override
-    public PageInfo<${ClassName}> getPageList(${ClassName}Query query) {
-        PageHelper.startPage(query.getPageIndex(), query.getPageSize());
-        List<${ClassName}> list = ${className}Mapper.getPageList(query);
-        return PageInfo.of(list);
+    public List<${ClassName}> selectList(${ClassName}Query query) {
+        return ${className}Mapper.selectList(query);
+    }
+
+    /**
+     * 新增${functionName}
+     *
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+        #if($table.sub)
+        @Transactional
+        #end
+    @Override
+    public int insert(${ClassName} ${className}) {
+        #if($table.sub)
+            int rows = ${className}Mapper.insert${ClassName}(${className});
+            insert${subClassName}(${className});
+            return rows;
+        #else
+            return ${className}Mapper.insert(${className});
+        #end
     }
 
-##    /**
-##     * 新增${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##        #if($table.sub)
-##        @Transactional
-##        #end
-##    @Override
-##    public int insert(${ClassName} ${className}) {
-##        #foreach ($column in $columns)
-##            #if($column.javaField == 'id')
+    /**
+     * 修改${functionName}
+     *
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    #if($table.sub)
+    @Transactional
+    #end
+    @Override
+    public int update(${ClassName} ${className}) {
+        #if($table.sub)
+                ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}())
+            ;
+            insert${subClassName}(${className});
+        #end
+        return ${className}Mapper.update(${className});
+    }
+
+    /**
+     * 批量删除${functionName}
+     *
+     * @param ids 需要删除的${functionName}主键
+     * @return 结果
+     */
+    #if($table.sub)
+    @Transactional
+    #end
+    @Override
+    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ids) {
+        #if($table.sub)
+                ${className}Mapper.deleteBy${subTableFkClassName}s(ids);
+        #end
+        return ${className}Mapper.deleteBy${pkColumn.capJavaField}s(ids);
+    }
+
+    /**
+     * 删除${functionName}信息
+     *
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    #if($table.sub)
+    @Transactional
+    #end
+    @Override
+    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
+        #if($table.sub)
+                ${className}Mapper.deleteBy${subTableFkClassName}(${pkColumn.javaField});
+        #end
+        return ${className}Mapper.deleteBy${pkColumn.capJavaField}(${pkColumn.javaField});
+    }
+
+    /**
+     * 逻辑删除${functionName}信息
+     *
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    #if($table.sub)
+    @Transactional
+    #end
+    @Override
+    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField}) {
+
+        return ${className}Mapper.logicDelete(${pkColumn.javaField});
+    }
+
+    #if($table.sub)
+    /**
+     * 新增${subTable.functionName}信息
+     *
+     * @param ${className} ${functionName}对象
+     */
+    public void insert${subClassName}(${ClassName} ${className}) {
+        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
+        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
+        if (StringUtils.isNotNull(${subclassName}List)) {
+            List<${subClassName}> list = new ArrayList<${subClassName}>();
+            for (${subClassName} ${subclassName} :${subclassName}List)
+            {
+                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
+                list.add(${subclassName});
+            }
+            if (list.size() > 0) {
+                    ${className}Mapper.batch(list);
+            }
+        }
+    }
+
+    #end
+    /**
+     * 导入${functionName}数据
+     *
+     * @param ${className}List ${functionName}数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param cacpTransUser 操作用户
+     * @return 结果
+     */
+    @Override
+    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser) {
+        if (CollectionUtils.isEmpty(${className}List)) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (${ClassName} ${className} : ${className}List) {
+            try {
+
+                BeanValidators.validateWithException(validator, ${className});
+                //id名称不统一,自行处理
 ##                ${className}.setId(new SnowflakeIdWorker(0, 0).nextId());
-##            #end
-##            #if($column.javaField == 'createTime')
-##                ${className}.setCreateTime(DateUtils.getNowDate());
-##            #end
-##            #if($column.javaField == 'updateTime')
-##                ${className}.setUpdateTime(DateUtils.getNowDate());
-##            #end
-##            #if($column.javaField == 'status')
+                ${className}.setCreateTime(DateUtils.getNowDate());
+                ${className}.setUpdateTime(DateUtils.getNowDate());
+                ${className}.setCreateUser(cacpTransUser.getUserId());
+                ${className}.setCreateDept(cacpTransUser.getParentGuid());
+
+##                ${className}.setCustomsCode(cacpTransUser.getCustomsCode());
 ##                ${className}.setStatus(0);
-##            #end
-##        #end
-##        #if($table.sub)
-##            int rows = ${className}Mapper.insert${ClassName}(${className});
-##            insert${subClassName}(${className});
-##            return rows;
-##        #else
-##            return ${className}Mapper.insert(${className});
-##        #end
-##    }
-##
-##    /**
-##     * 修改${functionName}
-##     *
-##     * @param ${className} ${functionName}
-##     * @return 结果
-##     */
-##    #if($table.sub)
-##    @Transactional
-##    #end
-##    @Override
-##    public int update(${ClassName} ${className}) {
-##        #foreach ($column in $columns)
-##            #if($column.javaField == 'updateTime')
-##                ${className}.setUpdateTime(DateUtils.getNowDate());
-##            #end
-##        #end
-##        #if($table.sub)
-##                ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}())
-##            ;
-##            insert${subClassName}(${className});
-##        #end
-##        return ${className}Mapper.update(${className});
-##    }
-##
-##    /**
-##     * 批量删除${functionName}
-##     *
-##     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键
-##     * @return 结果
-##     */
-##    #if($table.sub)
-##    @Transactional
-##    #end
-##    @Override
-##    public int deleteBy${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) {
-##        #if($table.sub)
-##                ${className}Mapper.deleteBy${subTableFkClassName}s(${pkColumn.javaField}s);
-##        #end
-##        return ${className}Mapper.deleteBy${pkColumn.capJavaField}s(${pkColumn.javaField}s);
-##    }
-##
-##    /**
-##     * 删除${functionName}信息
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    #if($table.sub)
-##    @Transactional
-##    #end
-##    @Override
-##    public int deleteBy${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
-##        #if($table.sub)
-##                ${className}Mapper.deleteBy${subTableFkClassName}(${pkColumn.javaField});
-##        #end
-##        return ${className}Mapper.deleteBy${pkColumn.capJavaField}(${pkColumn.javaField});
-##    }
-##
-##    /**
-##     * 逻辑删除${functionName}信息
-##     *
-##     * @param ${pkColumn.javaField} ${functionName}主键
-##     * @return 结果
-##     */
-##    #if($table.sub)
-##    @Transactional
-##    #end
-##    @Override
-##    public int logicDelete(${pkColumn.javaType} ${pkColumn.javaField}) {
-##
-##        return ${className}Mapper.logicDelete(${pkColumn.javaField});
-##    }
-##
-##    #if($table.sub)
-##    /**
-##     * 新增${subTable.functionName}信息
-##     *
-##     * @param ${className} ${functionName}对象
-##     */
-##    public void insert${subClassName}(${ClassName} ${className}) {
-##        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
-##        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
-##        if (StringUtils.isNotNull(${subclassName}List)) {
-##            List<${subClassName}> list = new ArrayList<${subClassName}>();
-##            for (${subClassName} ${subclassName} :${subclassName}List)
-##            {
-##                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
-##                list.add(${subclassName});
-##            }
-##            if (list.size() > 0) {
-##                    ${className}Mapper.batch(list);
-##            }
-##        }
-##    }
-##
-##    #end
-##    /**
-##     * 导入${functionName}数据
-##     *
-##     * @param ${className}List ${functionName}数据列表
-##     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-##     * @param cacpTransUser 操作用户
-##     * @return 结果
-##     */
-##    @Override
-##    public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, CacpTransUser cacpTransUser) {
-##        if (CollectionUtils.isEmpty(${className}List)) {
-##            throw new ServiceException("导入数据不能为空!");
-##        }
-##        int successNum = 0;
-##        int failureNum = 0;
-##        StringBuilder successMsg = new StringBuilder();
-##        StringBuilder failureMsg = new StringBuilder();
-##        for (${ClassName} ${className} : ${className}List) {
-##            try {
-##
-##                BeanValidators.validateWithException(validator, ${className});
-##                //id名称不统一,自行处理
-####                ${className}.setId(new SnowflakeIdWorker(0, 0).nextId());
-##                ${className}.setCreateTime(DateUtils.getNowDate());
-##                ${className}.setUpdateTime(DateUtils.getNowDate());
-##                ${className}.setCreateUser(cacpTransUser.getUserId());
-##                ${className}.setCreateDept(cacpTransUser.getParentGuid());
-##
-####                ${className}.setCustomsCode(cacpTransUser.getCustomsCode());
-####                ${className}.setStatus(0);
-##                ${className}Mapper.insert(${className});
-##                successNum++;
-##                successMsg.append("<br/>" + successNum + "、 " + cacpTransUser.getUserName() + " 导入成功");
-##
-##            } catch (Exception e) {
-##                failureNum++;
-##                String msg = "<br/>" + failureNum + "、" + cacpTransUser.getUserName() + " 导入失败:";
-##                failureMsg.append(msg + e.getMessage());
-##                log.error(msg, e);
-##            }
-##        }
-##        if (failureNum > 0) {
-##            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
-##            throw new ServiceException(failureMsg.toString());
-##        } else {
-##            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
-##        }
-##        return successMsg.toString();
-##    }
+                ${className}Mapper.insert(${className});
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、 " + cacpTransUser.getUserName() + " 导入成功");
+
+            } catch (Exception e) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、" + cacpTransUser.getUserName() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
 }

+ 0 - 73
wxjy-wxjy-service/src/main/resources/vm/java/sub-domain.java.vm

@@ -1,73 +0,0 @@
-package ${packageName}.domain;
-
-    #foreach ($import in $subImportList)
-    import ${import};
-    #end
-import cn.gov.customs.zhsj.common.annotation.Excel;
-
-/**
- * ${subTable.functionName}对象 ${subTableName}
- *
- * @author ${author}
- * @date ${datetime}
- */
-public class ${subClassName} extends BaseEntity
-        {
-private static final long serialVersionUID=1L;
-
-#foreach ($column in $subTable.columns)
-    #if(!$table.isSuperColumn($column.javaField))
-    /** $column.columnComment */
-        #if($column.list)
-            #set($parentheseIndex=$column.columnComment.indexOf("("))
-            #if($parentheseIndex != -1)
-                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-            #else
-                #set($comment=$column.columnComment)
-            #end
-            #if($parentheseIndex != -1)
-            @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-            #elseif($column.javaType == 'Date')
-            @JsonFormat(pattern = "yyyy-MM-dd")
-            @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-            #else
-            @Excel(name = "${comment}")
-            #end
-        #end
-    private $column.javaType $column.javaField;
-
-    #end
-#end
-#foreach ($column in $subTable.columns)
-    #if(!$table.isSuperColumn($column.javaField))
-        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-            #set($AttrName=$column.javaField)
-        #else
-            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        #end
-    public void set${AttrName}($column.javaType $column.javaField)
-            {
-            this.$column.javaField = $column.javaField;
-            }
-
-    public $column.javaType get${AttrName}()
-            {
-            return $column.javaField;
-            }
-    #end
-#end
-
-@Override
-public String toString(){
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-    #foreach ($column in $subTable.columns)
-        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-            #set($AttrName=$column.javaField)
-        #else
-            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        #end
-            .append("${column.javaField}",get${AttrName}())
-    #end
-        .toString();
-        }
-        }

+ 29 - 32
wxjy-wxjy-service/src/main/resources/vm/js/api.js.vm

@@ -1,44 +1,41 @@
+import type { AxiosResponse } from 'axios'
+import type { PageInfo, Result } from '@cacp/ui'
 import request from '@/utils/request'
 
+import type {${ClassName},${ClassName}Query}  from '@/types/${moduleName}/${businessName}'
+
+const contextPath = '/${moduleName}/${businessName}'
+
 // 查询${functionName}列表
-export function list${BusinessName}(query) {
-  return request({
-    url: '/${moduleName}/${businessName}/list',
-    method: 'get',
-    params: query
-  })
+export async function getList(query: ${ClassName}Query): Promise<Result<PageInfo<${ClassName}>>> {
+  const res: AxiosResponse<Result<PageInfo<${ClassName}>>> = await request.post(`${contextPath}/get-list`, query)
+  return res.data
 }
 
-// 查询${functionName}详细
-export function get${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'get'
-  })
+// 获取采购入库单详情
+export async function getDetail(${pkColumn.javaField}: ${pkColumn.javaType.toLowerCase()}): Promise<Result<${ClassName}>> {
+  const res: AxiosResponse<Result<${ClassName}>> = await request.get(`${contextPath}/get-detail?${pkColumn.javaField}=${${pkColumn.javaField}}`)
+  return res.data
 }
 
-// 新增${functionName}
-export function add${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'post',
-    data: data
-  })
+// 新增采购入库单
+export async function insert(row: ${ClassName}): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/insert-${className}`, row)
+  return res.data
 }
 
-// 修改${functionName}
-export function update${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'put',
-    data: data
-  })
+// 更新采购入库单
+export async function update(row: ${ClassName}): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/update-${className}`, row)
+  return res.data
 }
 
-// 删除${functionName}
-export function del${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'delete'
-  })
+// 删除采购入库单
+export async function remove(${className}s: ${pkColumn.javaType.toLowerCase()} | ${pkColumn.javaType.toLowerCase()}[]): Promise<Result<number>> {
+  // 统一转换为数组格式
+  const ids = Array.isArray(${className}s) ? ${className}s : [${className}s];
+  const res: AxiosResponse<Result<number>> = await request.post(
+          `${contextPath}/delete-${className}?ids`,ids
+  )
+  return res.data
 }

+ 49 - 0
wxjy-wxjy-service/src/main/resources/vm/type/type.ts.vm

@@ -0,0 +1,49 @@
+// ${functionName}
+export interface ${ClassName} {
+    #foreach ($column in $columns)
+        #if(!$table.isSuperColumn($column.javaField))
+            #if($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'int' || $column.javaType == 'long')
+                    $column.javaField?: number
+            #elseif($column.javaType == 'Date' || $column.javaType == 'DateTime')
+                    $column.javaField?: string
+            #elseif($column.javaType == 'Boolean' || $column.javaType == 'boolean')
+                    $column.javaField?: boolean
+            #elseif($column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'double' || $column.javaType == 'float')
+                    $column.javaField?: number
+            #else
+                    $column.javaField?: string
+            #end
+        #end
+    #end
+    #if($table.sub)
+            ${subclassName}List?: ${subClassName}[]
+    #end
+}
+
+// ${functionName}查询参数
+export interface ${ClassName}Query {
+    #foreach ($column in $columns)
+        #if(!$table.isSuperColumn($column.javaField) && $column.list)
+            #if($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'int' || $column.javaType == 'long')
+                    $column.javaField?: number
+            #elseif($column.javaType == 'Date' || $column.javaType == 'DateTime')
+                #if($column.javaField.toLowerCase().contains('time') || $column.javaField.toLowerCase().contains('date'))
+                    begin${column.javaField.substring(0,1).toUpperCase()}${column.javaField.substring(1)}?: string
+                    end${column.javaField.substring(0,1).toUpperCase()}${column.javaField.substring(1)}?: string
+                #else
+                        $column.javaField?: string
+                #end
+            #elseif($column.javaType == 'Boolean' || $column.javaType == 'boolean')
+                    $column.javaField?: boolean
+            #elseif($column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'double' || $column.javaType == 'float')
+                    $column.javaField?: number
+            #else
+                    $column.javaField?: string
+            #end
+        #end
+    #end
+    beginDate?: string
+    endDate?: string
+    pageIndex?: number
+    pageSize?: number
+}

+ 701 - 751
wxjy-wxjy-service/src/main/resources/vm/vue/index.vue.vm

@@ -1,778 +1,728 @@
 <template>
-  <div class="app-container" style="padding-top: 10px;">
-    <div class="content-margin-query" style="">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-    #foreach($column in $columns)
-    #if($column.query)
-    #set($dictType=$column.dictType)
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-            v-model="queryParams.${column.javaField}"
-            placeholder="请输入${comment}"
-            clearable
-            @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-##          <el-option
-##              v-for="dict in dict.type.${dictType}"
-##              :key="dict.value"
-##              :label="dict.label"
-##              :value="dict.value"
-##          />
-        </el-select>
-      </el-form-item>
-    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-                        v-model="queryParams.${column.javaField}"
+  <cacp-search-layout>
+    <template #search>
+      <cacp-search-panel-layout
+          :model="state.queryData"
+          ref="queryFormRef"
+          label-position="left"
+          label-width="auto"
+          :gutter="30"
+          :colSpan="6"
+      >
+          #foreach($column in $columns)
+              #if($column.query)
+                  #set($parentheseIndex=$column.columnComment.indexOf("("))
+                  #if($parentheseIndex != -1)
+                      #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                  #else
+                      #set($comment=$column.columnComment)
+                  #end
+                  #set($dictType=$column.dictType)
+                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                  #if($column.htmlType == "input")
+                    <el-form-item label="${comment}" prop="${column.javaField}">
+                      <el-input v-model="state.queryData.${column.javaField}" placeholder="请输入${comment}" clearable />
+                    </el-form-item>
+                  #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
+                    <el-form-item label="${comment}" prop="${column.javaField}">
+                      <el-select v-model="state.queryData.${column.javaField}" placeholder="请选择${comment}" clearable>
+                          ## <el-option
+            ##   v-for="dict in dict.type.${dictType}"
+            ##   :key="dict.value"
+            ##   :label="dict.label"
+            ##   :value="dict.value"
+            ## />
+                      </el-select>
+                    </el-form-item>
+                  #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
+                    <el-form-item label="${comment}" prop="${column.javaField}">
+                      <el-date-picker
+                          clearable
+                          v-model="state.queryData.${column.javaField}"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择${comment}"
+                      />
+                    </el-form-item>
+                  #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                    <el-form-item label="${comment}">
+                      <el-date-picker
+                          type="daterange"
+                          value-format="YYYY-MM-DD"
+                          v-model="state.queryData.begin${AttrName}"
+                          placeholder="开始时间"
+                      />
+                    </el-form-item>
+                    <el-form-item label="到">
+                      <el-date-picker
+                          type="daterange"
+                          value-format="YYYY-MM-DD"
+                          v-model="state.queryData.end${AttrName}"
+                          placeholder="结束时间"
+                      />
+                    </el-form-item>
+                  #end
+              #end
+          #end
+        <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="120"
+        @selection-change="handleSelectionChange"
+        @on-page-change="onPageChange"
+        @on-size-change="onSizeChange"
+        :loading="loading"
+    >
+      <el-table-column type="selection" width="36" fixed="left" />
+        #foreach($column in $columns)
+            #set($javaField=$column.javaField)
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($column.pk)
+              <el-table-column property="${javaField}" label="${comment}" width="100" :show-overflow-tooltip="true" />
+            #elseif($column.list && $column.htmlType == "datetime")
+              <el-table-column property="${javaField}" label="${comment}" width="120" sortable>
+                <template #default="scope">
+                  {{ scope.row.${javaField} ? dayjs(scope.row.${javaField}).format('YYYY-MM-DD') : '' }}
+                </template>
+              </el-table-column>
+            #elseif($column.list && $column.htmlType == "datetime" && $column.javaField.toLowerCase().contains('time'))
+              <el-table-column property="${javaField}" label="${comment}" width="160" sortable>
+                <template #default="scope">
+                  {{ scope.row.${javaField} ? dayjs(scope.row.${javaField}).format('YYYY-MM-DD HH:mm') : '' }}
+                </template>
+              </el-table-column>
+            #elseif($column.list && "" != $column.dictType)
+              <el-table-column property="${javaField}" label="${comment}" width="120">
+                <template #default="scope">
+                    ## <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}" />
+                  {{ scope.row.${javaField} }}
+                </template>
+              </el-table-column>
+            #elseif($column.list && "" != $javaField)
+              <el-table-column property="${javaField}" label="${comment}" width="120" :show-overflow-tooltip="true" />
+            #end
+        #end
+    </cacp-complex-table>
+  </cacp-search-layout>
+
+  <cacp-dialog
+      v-model="state.dialogVisible"
+      :resizable="false"
+      :title="state.title"
+      width="60%"
+      @closed="onDialogClosed"
+  >
+    <el-form
+        :model="state.formData"
+        ref="dialogFormRef"
+        :rules="infoRules"
+        label-width="auto"
+        label-position="left"
+        :disabled="!state.isEdit"
+    >
+    <el-row :gutter="20">
+        #set($colCount = 0)
+        #foreach($column in $columns)
+            #if($column.insert && !$column.pk)
+                #set($field=$column.javaField)
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+                #set($dictType=$column.dictType)
+                #set($colCount = $colCount + 1)
+                #if($colCount % 2 == 1)
+                <el-col :span="12">
+                #else
+                <el-col :span="12">
+                #end
+                #if($column.htmlType == "input")
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-input v-model="state.formData.${field}" placeholder="请输入${comment}" />
+                  </el-form-item>
+                #elseif($column.htmlType == "textarea")
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-input v-model="state.formData.${field}" type="textarea" placeholder="请输入${comment}" />
+                  </el-form-item>
+                #elseif($column.htmlType == "select" && "" != $dictType)
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-select v-model="state.formData.${field}" placeholder="请选择${comment}" clearable>
+                        ## <el-option
+              ##   v-for="dict in dict.type.${dictType}"
+              ##   :key="dict.value"
+              ##   :label="dict.label"
+              ##   :value="dict.value"
+              ## />
+                    </el-select>
+                  </el-form-item>
+                #elseif($column.htmlType == "datetime")
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-date-picker
+                        v-model="state.formData.${field}"
                         type="date"
-                        value-format="yyyy-MM-dd"
-                        placeholder="请选择${comment}">
-        </el-date-picker>
-      </el-form-item>
-    #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}">
-        <el-date-picker
-            v-model="daterange${AttrName}"
-            style="width: 240px"
-            value-format="yyyy-MM-dd"
-            type="daterange"
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-    #end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
+                        value-format="YYYY-MM-DD"
+                        placeholder="请选择${comment}"
+                        style="width: 100%"
+                    />
+                  </el-form-item>
+                #elseif($column.htmlType == "radio" && "" != $dictType)
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-radio-group v-model="state.formData.${field}">
+                        ## <el-radio
+              ##   v-for="dict in dict.type.${dictType}"
+              ##   :key="dict.value"
+              ##   :label="dict.value"
+              ## >{{ dict.label }}</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                #elseif($column.htmlType == "checkbox" && "" != $dictType)
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-checkbox-group v-model="state.formData.${field}">
+                        ## <el-checkbox
+              ##   v-for="dict in dict.type.${dictType}"
+              ##   :key="dict.value"
+              ##   :label="dict.value"
+              ## >{{ dict.label }}</el-checkbox>
+                    </el-checkbox-group>
+                  </el-form-item>
+                #else
+                  <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
+                    <el-input v-model="state.formData.${field}" placeholder="请输入${comment}" />
+                  </el-form-item>
+                #end
+            </el-col>
+                #if($colCount % 2 == 0 && $foreach.hasNext)
+                </el-row><el-row :gutter="20">
+                #end
+            #end
+        #end
+    </el-row>
+
+        #if($table.sub)
+          <el-divider content-position="center">${subTable.functionName}信息</el-divider>
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">添加</el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">删除</el-button>
+            </el-col>
+          </el-row>
+          <el-table highlight-selection-row :data="state.${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
+            <el-table-column type="selection" width="50" align="center" />
+            <el-table-column label="序号" align="center" prop="index" width="50"/>
+              #foreach($column in $subTable.columns)
+                  #set($javaField=$column.javaField)
+                  #set($parentheseIndex=$column.columnComment.indexOf("("))
+                  #if($parentheseIndex != -1)
+                      #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                  #else
+                      #set($comment=$column.columnComment)
+                  #end
+                  #if($column.pk || $javaField == ${subTableFkclassName})
+                  #elseif($column.list && $column.htmlType == "input")
+                    <el-table-column label="$comment" prop="${javaField}" width="150">
+                      <template #default="scope">
+                        <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
+                      </template>
+                    </el-table-column>
+                  #elseif($column.list && $column.htmlType == "datetime")
+                    <el-table-column label="$comment" prop="${javaField}" width="240">
+                      <template #default="scope">
+                        <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="YYYY-MM-DD" placeholder="请选择$comment" style="width: 100%" />
+                      </template>
+                    </el-table-column>
+                  #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
+                    <el-table-column label="$comment" prop="${javaField}" width="150">
+                      <template #default="scope">
+                        <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
+                            ## <el-option
+              ##   v-for="dict in dict.type.$column.dictType"
+              ##   :key="dict.value"
+              ##   :label="dict.label"
+              ##   :value="dict.value"
+              ## ></el-option>
+                        </el-select>
+                      </template>
+                    </el-table-column>
+                  #end
+              #end
+          </el-table>
+        #end
     </el-form>
-    </div>
-
-    <div class="content-margin-table">
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="el-icon-plus"
-            size="mini"
-            @click="handleAdd"
-##            v-hasPermi="['${moduleName}:${businessName}:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="success"
-            plain
-            icon="el-icon-edit"
-            size="mini"
-            :disabled="single"
-            @click="handleUpdate"
-##            v-hasPermi="['${moduleName}:${businessName}:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="danger"
-            plain
-            icon="el-icon-delete"
-            size="mini"
-            :disabled="multiple"
-            @click="handleDelete"
-##            v-hasPermi="['${moduleName}:${businessName}:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="warning"
-            plain
-            icon="el-icon-download"
-            size="mini"
-            @click="handleExport"
-##            v-hasPermi="['${moduleName}:${businessName}:export']"
-        >导出</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="info"
-            plain
-            icon="el-icon-upload2"
-            size="mini"
-            @click="handleImport"
-            v-hasPermi="['bus:${businessName}:import']"
-        >导入</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    <template #footer v-if="state.isEdit">
+      <el-button @click="onDialogClosed">取消</el-button>
+      <el-button type="primary" @click="onSubmit">确定</el-button>
+    </template>
+  </cacp-dialog>
+
+  <cacp-dialog
+      v-model="state.viewDialogVisible"
+      :resizable="false"
+      :title="state.viewTitle"
+      width="50%"
+  >
+    <el-form
+        :model="state.viewForm"
+        label-width="auto"
+        label-position="left"
+        :disabled="true"
+    >
+    <el-row :gutter="20">
+        #set($colCount = 0)
+        #foreach($column in $columns)
+            #if($column.insert && !$column.pk)
+                #set($field=$column.javaField)
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+                #set($colCount = $colCount + 1)
+                #if($colCount % 2 == 1)
+                <el-col :span="12">
+                #else
+                <el-col :span="12">
+                #end
+              <el-form-item label="${comment}:" prop="${field}">
+                <span>{{ state.viewForm.${field} || '-' }}</span>
+              </el-form-item>
+            </el-col>
+                #if($colCount % 2 == 0 && $foreach.hasNext)
+                </el-row><el-row :gutter="20">
+                #end
+            #end
+        #end
     </el-row>
+    </el-form>
+  </cacp-dialog>
+</template>
 
-    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-#foreach($column in $columns)
-    #set($javaField=$column.javaField)
-    #set($parentheseIndex=$column.columnComment.indexOf("("))
-    #if($parentheseIndex != -1)
-        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-    #else
-        #set($comment=$column.columnComment)
-    #end
-    #if($column.pk)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-    #elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-##                <template slot-scope="scope">
-##                  <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-##                <template slot-scope="scope">
-##                  <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-##                </template>
-      </el-table-column>
-    #elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-##                <template slot-scope="scope">
-##                    #if($column.htmlType == "checkbox")
-##                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-##                    #else
-##                      <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
-##                    #end
-##                </template>
-      </el-table-column>
-    #elseif($column.list && "" != $javaField)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-    #end
-#end
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width"  width="150px">
-        <template slot-scope="scope">
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-view"
-              @click="handleView(scope.row)"
-              ##              v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >查看</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleUpdate(scope.row)"
-##              v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >修改</el-button>
-          <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-delete"
-              @click="handleDelete(scope.row)"
-##              v-hasPermi="['${moduleName}:${businessName}:remove']"
-          >删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-        v-show="total>0"
-        :total="total"
-        :page.sync="queryParams.pageNum"
-        :limit.sync="queryParams.pageSize"
-        @pagination="getList"
-    />
-    </div>
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-  #foreach($column in $columns)
-      #set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-  #if(($column.usableColumn) || (!$column.superColumn))
-      #set($parentheseIndex=$column.columnComment.indexOf("("))
-      #if($parentheseIndex != -1)
-          #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-      #else
-          #set($comment=$column.columnComment)
-      #end
-      #set($dictType=$column.dictType)
-      #if($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-        </el-form-item>
-      #elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-      #elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-      #elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-      #elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-##                    <el-option
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        :label="dict.label"
-##                        #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                        :value="parseInt(dict.value)"
-##                        #else
-##                        :value="dict.value"
-##                        #end
-##                    ></el-option>
-          </el-select>
-        </el-form-item>
-      #elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
-        </el-form-item>
-      #elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-##                    <el-checkbox
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        :label="dict.value">
-##                      {{dict.label}}
-##                    </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      #elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>请选择字典生成</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      #elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-##                  <el-radio-group v-model="form.${field}">
-##                    <el-radio
-##                        v-for="dict in dict.type.${dictType}"
-##                        :key="dict.value"
-##                        #if($column.javaType == "Integer" || $column.javaType == "Long")
-##                        :label="parseInt(dict.value)"
-##                        #else
-##                        :label="dict.value"
-##                        #end
-##                    >{{dict.label}}</el-radio>
-##                  </el-radio-group>
-        </el-form-item>
-      #elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">请选择字典生成</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      #elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-                          v-model="form.${field}"
-                          type="date"
-                          value-format="yyyy-MM-dd"
-                          placeholder="请选择${comment}">
-          </el-date-picker>
-        </el-form-item>
-      #elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
+<script lang="ts" setup>
+  import { onMounted, reactive, ref } from 'vue'
+  import type { FormInstance } from 'element-plus'
+  import { ElMessage, ElMessageBox, type FormRules } from 'element-plus'
+  import config from '@/config'
+  import {
+    SuccessResultCode,
+    useComplexTable,
+    type Result,
+    type SearchPanelLayoutInstance,
+    type TableAction,
+    useLoading
+  } from '@cacp/ui'
+  import type { ${ClassName}, ${ClassName}Query } from '@/types/${moduleName}/${businessName}'
+  import { insert, getList, getDetail, remove, update } from '@/apis/${moduleName}/${businessName}'
+  import { permissionStatus } from '@/utils/globalPermission'
+
+  // 表单引用
+  const queryFormRef = ref<SearchPanelLayoutInstance>()
+  const dialogFormRef = ref<FormInstance>()
+
+  // 加载状态
+  const { loading, setLoading } = useLoading()
+
+  // 表格 Hook
+  const tableHooks = useComplexTable<${ClassName}>(config)
+  const { tableData, tablePagination, setPagination, setPageIndex, setPageSizes } = tableHooks
+
+  // 响应式数据
+  interface State {
+    queryData: ${ClassName}Query
+    formData: ${ClassName}
+    viewForm: ${ClassName}
+    viewTitle: string
+    viewDialogVisible: boolean
+    title: string
+    isEdit: boolean
+    dialogVisible: boolean
+      #if($table.sub)
+              ${subclassName}List: any[]
+        checked${subClassName}: number[]
       #end
-  #end
-#end
-  #end
-  #if($table.sub)
-    <el-divider content-position="center">${subTable.functionName}信息</el-divider>
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">添加</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">删除</el-button>
-      </el-col>
-    </el-row>
-    <el-table highlight-selection-row :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-      <el-table-column type="selection" width="50" align="center" />
-      <el-table-column label="序号" align="center" prop="index" width="50"/>
-    #foreach($column in $subTable.columns)
-        #set($javaField=$column.javaField)
-        #set($parentheseIndex=$column.columnComment.indexOf("("))
-        #if($parentheseIndex != -1)
-            #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-        #else
-            #set($comment=$column.columnComment)
+  }
+
+  const state = reactive<State>({
+    queryData: {
+        #foreach($column in $columns)
+            #if($column.query)
+                $column.javaField: #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")''#else''#end,
+                #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                  begin${AttrName}: '',
+                  end${AttrName}: '',
+                #end
+            #end
+        #end
+      pageIndex: tablePagination.currentPage,
+      pageSize: tablePagination.pageSize
+    },
+    formData: {
+        #foreach($column in $columns)
+            $column.javaField: #if($column.htmlType == "checkbox")[]#elseif($column.javaType == 'Long' || $column.javaType == 'Integer')null#else''#end,
         #end
-        #if($column.pk || $javaField == ${subTableFkclassName})
-        #elseif($column.list && $column.htmlType == "input")
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
-            </template>
-          </el-table-column>
-        #elseif($column.list && $column.htmlType == "datetime")
-          <el-table-column label="$comment" prop="${javaField}" width="240">
-            <template slot-scope="scope">
-              <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="yyyy-MM-dd" placeholder="请选择$comment" />
-            </template>
-          </el-table-column>
-        #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-##                <el-option
-##                    v-for="dict in dict.type.$column.dictType"
-##                    :key="dict.value"
-##                    :label="dict.label"
-##                    :value="dict.value"
-##                ></el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-        #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                <el-option label="请选择字典生成" value="" />
-              </el-select>
-            </template>
-          </el-table-column>
+        #if($table.sub)
+                ${subclassName}List: []
         #end
-    #end
-    </el-table>
-  #end
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 查看的对话框 -->
-    <el-dialog :title="viewTitle" :visible.sync="viewOpen" width="500px" append-to-body>
-      <el-form ref="form" :model="viewForm" :rules="rules" label-width="80px">
-        <el-row>
-#foreach($column in $columns)
-  #set($field=$column.javaField)
-  #if($column.insert && !$column.pk)
-          #if(($column.usableColumn) || (!$column.superColumn))
+    } as ${ClassName},
+    viewForm: {} as ${ClassName},
+    viewTitle: '',
+    viewDialogVisible: false,
+    title: '',
+    isEdit: false,
+    dialogVisible: false,
+      #if($table.sub)
+              ${subclassName}List: [],
+        checked${subClassName}: []
+      #end
+  })
+
+  // 表单验证规则
+  const infoRules = reactive<FormRules<${ClassName}>>({
+      #foreach($column in $columns)
+          #if($column.required)
               #set($parentheseIndex=$column.columnComment.indexOf("("))
               #if($parentheseIndex != -1)
                   #set($comment=$column.columnComment.substring(0, $parentheseIndex))
               #else
                   #set($comment=$column.columnComment)
               #end
-              #set($dictType=$column.dictType)
-          <el-col :span="24">
-          #if($column.htmlType == "input")
-            <el-form-item label="${comment}:" prop="${field}"  label-width="120px">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "imageUpload")
-            <el-form-item label="${comment}:" prop="${field}" label-width="120px">
-              <image-upload v-model="viewForm.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "fileUpload")
-            <el-form-item label="${comment}:" prop="${field}"  label-width="120px">
-              <file-upload v-model="viewForm.${field}"/>
-            </el-form-item>
-          #elseif($column.htmlType == "editor")
-            <el-form-item label="${comment}:"  label-width="120px">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "select" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "select" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-checkbox-group v-model="viewForm.${field}">
-              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "checkbox" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-checkbox-group v-model="viewForm.${field}">
-                <el-checkbox>请选择字典生成</el-checkbox>
-              </el-checkbox-group>
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && "" != $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-            </el-form-item>
-          #elseif($column.htmlType == "radio" && $dictType)
-            <el-form-item label="${comment}:" prop="${field}">
-              <el-radio-group v-model="viewForm.${field}">
-                <el-radio label="1">请选择字典生成</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          #elseif($column.htmlType == "datetime")
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
-          #elseif($column.htmlType == "textarea")
-            <el-form-item label="${comment}:" prop="${field}">
-              {{viewForm.${field}}}
-            </el-form-item>
+                  ${column.javaField}: [
+              { required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")'change'#else'blur'#end }
+            ],
           #end
-          </el-col>
-          #end
-  #end
-#end
-        </el-row>
-      </el-form>
-    </el-dialog>
-    <!-- 导入对话框 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-          ref="upload"
-          :limit="1"
-          accept=".xlsx, .xls"
-          :headers="upload.headers"
-          :action="upload.url + '?updateSupport=' + upload.updateSupport"
-          :disabled="upload.isUploading"
-          :on-progress="handleFileUploadProgress"
-          :on-success="handleFileSuccess"
-          :auto-upload="false"
-          drag
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据
-          </div>
-          <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
-        </div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">确 定</el-button>
-        <el-button @click="upload.open = false">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-  import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-  import {getToken} from "@/utils/auth";
-  export default {
-    name: "${BusinessName}",
-      #if(${dicts} != '')
-        dicts: [${dicts}],
       #end
-    data() {
-      return {
-        viewTitle:"",
-          viewOpen:false,
-          viewForm:{},
-        // 遮罩层
-        loading: true,
-        // 选中数组
-        ids: [],
-          #if($table.sub)
-            // 子表选中数据
-            checked${subClassName}: [],
-          #end
-        // 非单个禁用
-        single: true,
-        // 非多个禁用
-        multiple: true,
-        // 显示搜索条件
-        showSearch: true,
-        // 总条数
-        total: 0,
-// ${functionName}表格数据
-      ${businessName}List: [],
-  #if($table.sub)
-    // ${subTable.functionName}表格数据
-          ${subclassName}List: [],
-  #end
-        // 弹出层标题
-        title: "",
-        // 是否显示弹出层
-        open: false,
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                // $comment时间范围
-                daterange${AttrName}: [],
-              #end
-          #end
-        // 查询参数
-        queryParams: {
-          pageNum: 1,
-          pageSize: 10,
-            #foreach ($column in $columns)
-                #if($column.query)
-          $column.javaField: null#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        },
-        // 表单参数
-        form: {},
-        // 表单校验
-        rules: {
-            #foreach ($column in $columns)
-    #if($column.required)
-        #set($parentheseIndex=$column.columnComment.indexOf("("))
-        #if($parentheseIndex != -1)
-            #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-        #else
-            #set($comment=$column.columnComment)
-        #end
-            $column.javaField: [
-        { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-      ]#if($foreach.count != $columns.size()),#end
-    #end
-#end
-        },
-        // ${functionName}导入参数
-        upload: {
-          // 是否显示弹出层(${functionName}导入)
-          open: false,
-          // 弹出层标题(${functionName}导入)
-          title: "",
-          // 是否禁用上传
-          isUploading: false,
-          // 是否更新已经存在的${functionName}数据
-          updateSupport: 0,
-          // 设置上传的请求头部
-          headers: { Authorization: "Bearer " + getToken() },
-          // 上传的地址
-          url: process.env.VUE_APP_BASE_API + "/${moduleName}/${businessName}/importData"
-        },
-      };
+  })
+
+  // 表格操作按钮配置
+  const actions = <Array<TableAction>>[
+    {
+      key: 'create',
+      text: '新增',
+      onclick: onCreate,
+      limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_ADD_BT'),
+      position: 'left',
+      type: 'primary',
     },
-    created() {
-      this.getList();
+    {
+      key: 'view',
+      text: '查看',
+      onclick: onView,
+      limit: permissionStatus('one', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_VIEW_BT'),
+      type: 'primary'
     },
-    methods: {
-      /** 查询${functionName}列表 */
-      getList() {
-        this.loading = true;
-  #foreach ($column in $columns)
-      #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-        this.queryParams.params = {};
-          #break
-      #end
-  #end
-  #foreach ($column in $columns)
-      #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-          #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
-          this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
-          this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
-        }
+    {
+      key: 'edit',
+      text: '修改',
+      onclick: onEdit,
+      limit: permissionStatus('one', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_EDIT_BT'),
+      type: 'primary'
+    },
+    {
+      key: 'delete',
+      text: '删除',
+      onclick: onDelete,
+      confirm: true,
+      limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_DELETE_BT'),
+      type: 'primary'
+    },
+      #if($table.genTable.importTable)
+        {
+          key: 'import',
+          type: 'primary',
+          text: '导入',
+          onclick: onImport,
+          limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_IMPORT_BT'),
+          position: 'right',
+          plain: true
+        },
+        {
+          key: 'export',
+          type: 'primary',
+          text: '导出',
+          onclick: onExport,
+          limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_EXPORT_BT'),
+          position: 'right',
+          plain: true
+        },
       #end
-  #end
-        list${BusinessName}(this.queryParams).then(response => {
-          this.${businessName}List = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        });
-      },
-      // 取消按钮
-      cancel() {
-        this.open = false;
-        this.reset();
-      },
-      // 表单重置
-      reset() {
-        this.form = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-        };
-          #if($table.sub)
-            this.${subclassName}List = [];
-          #end
-        this.resetForm("form");
-      },
-      /** 搜索按钮操作 */
-      handleQuery() {
-        this.queryParams.pageNum = 1;
-        this.getList();
-      },
-      /** 重置按钮操作 */
-      resetQuery() {
-          #foreach ($column in $columns)
-              #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                  #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                this.daterange${AttrName} = [];
-              #end
+    {
+      key: 'refresh',
+      type: 'primary',
+      text: '刷新',
+      onclick: onRefresh,
+      limit: 'none',
+      position: 'left',
+      plain: true
+    }
+  ]
+
+  // 选中项的 ID 数组
+  const ids = ref<string[]>([])
+
+  // 多选框选中数据
+  function handleSelectionChange(selection: ${ClassName}[]) {
+    ids.value = selection
+        .map(item => item.${pkColumn.javaField})
+        .filter((id): id is string => id != null && id !== undefined)
+  }
+
+  // 搜索方法
+  const onSearch = () => {
+    setPageIndex(1)
+    onLoadData()
+  }
+
+  // 重置方法
+  const onReset = () => {
+    queryFormRef.value?.resetFields()
+      #foreach($column in $columns)
+          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+            state.queryData.begin${AttrName} = ''
+            state.queryData.end${AttrName} = ''
           #end
-        this.resetForm("queryForm");
-        this.handleQuery();
-      },
-      // 多选框选中数据
-      handleSelectionChange(selection) {
-        this.ids = selection.map(item => item.${pkColumn.javaField})
-        this.single = selection.length!==1
-        this.multiple = !selection.length
-      },
-      /** 新增按钮操作 */
-      handleAdd() {
-        this.reset();
-        this.open = true;
-        this.title = "添加${functionName}";
-      },
-      /** 修改按钮操作 */
-      handleView(row) {
-        this.viewForm = row;
-        this.viewOpen = true;
-        this.viewTitle = "${functionName}详情";
-      },
-      /** 修改按钮操作 */
-      handleUpdate(row) {
-        this.reset();
-        const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
-        get${BusinessName}(${pkColumn.javaField}).then(response => {
-          this.form = response.data;
-            #foreach ($column in $columns)
-                #if($column.htmlType == "checkbox")
-                  this.form.$column.javaField = this.form.${column.javaField}.split(",");
-                #end
-            #end
-            #if($table.sub)
-              this.${subclassName}List = response.data.${subclassName}List;
-            #end
-          this.open = true;
-          this.title = "修改${functionName}";
-        });
-      },
-      /** 提交按钮 */
-      submitForm() {
-        this.#[[$]]#refs["form"].validate(valid => {
-          if (valid) {
-            #foreach ($column in $columns)
+      #end
+    onPageChange(1)
+  }
+
+  // 每页显示条数变化
+  const onSizeChange = (size: number) => {
+    setPageSizes(size)
+    onLoadData()
+  }
+
+  // 翻页查询
+  const onPageChange = (currentPage: number) => {
+    setPageIndex(currentPage)
+    onLoadData()
+  }
+
+  // 弹框关闭方法
+  function onDialogClosed() {
+    state.dialogVisible = false
+    resetForm()
+  }
+
+  // 重置表单
+  function resetForm() {
+    state.formData = {
+        #foreach($column in $columns)
+            $column.javaField: #if($column.htmlType == "checkbox")[]#elseif($column.javaType == 'Long' || $column.javaType == 'Integer')null#else''#end,
+        #end
+        #if($table.sub)
+                ${subclassName}List: []
+        #end
+    } as ${ClassName}
+      #if($table.sub)
+        state.${subclassName}List = []
+      #end
+    dialogFormRef.value?.resetFields()
+  }
+
+  // 刷新方法
+  function onRefresh() {
+    onReset()
+  }
+
+  // 新增
+  function onCreate() {
+    resetForm()
+    state.dialogVisible = true
+    state.isEdit = true
+    state.title = '新增${functionName}'
+  }
+
+  // 查看
+  function onView(row: ${ClassName}) {
+    state.viewForm = { ...row }
+    state.viewDialogVisible = true
+    state.viewTitle = '查看${functionName}详情'
+  }
+
+  // 编辑
+  async function onEdit(row: ${ClassName}) {
+    const res = await getDetail(row.${pkColumn.javaField})
+    if (res.code === SuccessResultCode) {
+      state.formData = res.data
+        #foreach($column in $columns)
             #if($column.htmlType == "checkbox")
-            this.form.$column.javaField = this.form.${column.javaField}.join(",");
-            #end
+              if (state.formData.${column.javaField}) {
+                state.formData.${column.javaField} = state.formData.${column.javaField}.split(',')
+              } else {
+                state.formData.${column.javaField} = []
+              }
             #end
-            #if($table.sub)
-            this.form.${subclassName}List = this.${subclassName}List;
-            #end
-            if (this.form.${pkColumn.javaField} != null) {
-              update${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("修改成功");
-                this.open = false;
-                this.getList();
-              });
-            } else {
-              add${BusinessName}(this.form).then(response => {
-                this.#[[$modal]]#.msgSuccess("新增成功");
-                this.open = false;
-                this.getList();
-              });
-            }
-          }
-        });
-      },
-      /** 删除按钮操作 */
-      handleDelete(row) {
-        const ${pkColumn.javaField}s = row.${pkColumn.javaField} || this.ids;
-        this.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + ${pkColumn.javaField}s + '"的数据项?').then(function() {
-          return del${BusinessName}(${pkColumn.javaField}s);
-        }).then(() => {
-          this.getList();
-          this.#[[$modal]]#.msgSuccess("删除成功");
-        }).catch(() => {});
-      },
-  #if($table.sub)
-  /** ${subTable.functionName}序号 */
-  row${subClassName}Index({ row, rowIndex }) {
-    row.index = rowIndex + 1;
-  },
-  /** ${subTable.functionName}添加按钮操作 */
-  handleAdd${subClassName}() {
-    let obj = {};
-    #foreach($column in $subTable.columns)
-    #if($column.pk || $column.javaField == ${subTableFkclassName})
-    #elseif($column.list && "" != $javaField)
-    obj.$column.javaField = "";
-    #end
-    #end
-    this.${subclassName}List.push(obj);
-  },
-  /** ${subTable.functionName}删除按钮操作 */
-  handleDelete${subClassName}() {
-    if (this.checked${subClassName}.length == 0) {
-      this.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
+        #end
+        #if($table.sub)
+          state.${subclassName}List = res.data.${subclassName}List || []
+        #end
+      state.dialogVisible = true
+      state.isEdit = true
+      state.title = '修改${functionName}'
     } else {
-      const ${subclassName}List = this.${subclassName}List;
-      const checked${subClassName} = this.checked${subClassName};
-      this.${subclassName}List = ${subclassName}List.filter(function(item) {
-        return checked${subClassName}.indexOf(item.index) == -1
-      });
+      ElMessage.error(res.message || '数据获取异常')
     }
-  },
-  /** 复选框选中数据 */
-  handle${subClassName}SelectionChange(selection) {
-    this.checked${subClassName} = selection.map(item => item.index)
-  },
-  #end
-      /** 导出按钮操作 */
-      handleExport() {
-        this.download('${moduleName}/${businessName}/export', {
-          ...this.queryParams
-        }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-      },
-      /** 导入按钮操作 */
-      handleImport() {
-        this.upload.title = "企业分类信息导入";
-        this.upload.open = true;
-      },
-      /** 下载模板操作 */
-      importTemplate() {
-        this.download('${moduleName}/${businessName}/importTemplate', {
-        }, `${businessName}_template.xlsx`)
-      },
-      // 文件上传中处理
-      handleFileUploadProgress(event, file, fileList) {
-        this.upload.isUploading = true;
-      },
-      // 文件上传成功处理
-      handleFileSuccess(response, file, fileList) {
-        this.upload.open = false;
-        this.upload.isUploading = false;
-        this.$refs.upload.clearFiles();
-        this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-        this.getList();
-      },
-      // 提交上传文件
-      submitFileForm() {
-        this.$refs.upload.submit();
+  }
+
+  // 删除
+  async function onDelete(row: ${ClassName}) {
+    const deleteIds = row.${pkColumn.javaField} || ids.value
+    if (!deleteIds || deleteIds.length === 0) {
+      ElMessage.warning('请选择要删除的数据')
+      return
+    }
+
+    try {
+      await ElMessageBox.confirm('确定要删除选中的${functionName}吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+
+      const res = await remove(deleteIds)
+      if (res.code === SuccessResultCode) {
+        ElMessage.success('删除成功')
+        onPageChange(1)
+      } else {
+        ElMessage.error(res.message || '删除失败')
       }
+    } catch{
+      // 用户取消删除
+    }
   }
-  };
+
+      #if($table.genTable.importTable)
+      // 导入
+      function onImport() {
+        // TODO: 实现导入功能
+        ElMessage.info('导入功能待实现')
+      }
+
+      // 导出
+      function onExport() {
+        // TODO: 实现导出功能
+        ElMessage.info('导出功能待实现')
+      }
+      #end
+
+  // 新增/修改提交
+  async function onSubmit() {
+    if (!dialogFormRef.value) return
+
+    const isValid = await dialogFormRef.value.validate()
+    if (!isValid) return
+
+    try {
+        #foreach($column in $columns)
+            #if($column.htmlType == "checkbox")
+              if (Array.isArray(state.formData.${column.javaField})) {
+                state.formData.${column.javaField} = state.formData.${column.javaField}.join(',')
+              }
+            #end
+        #end
+
+        #if($table.sub)
+          state.formData.${subclassName}List = state.${subclassName}List
+        #end
+
+      let res: Result<any>
+      if (state.formData.${pkColumn.javaField}) {
+        res = await update(state.formData)
+      } else {
+        res = await insert(state.formData)
+      }
+
+      if (res.code === SuccessResultCode) {
+        ElMessage.success(state.formData.${pkColumn.javaField} ? '修改成功' : '新增成功')
+        state.dialogVisible = false
+        onPageChange(1)
+      } else {
+        ElMessage.error(res.message || '操作失败')
+      }
+    } catch (error) {
+      console.error('提交失败:', error)
+      ElMessage.error('操作失败')
+    }
+  }
+
+  // 数据查询
+  async function onLoadData() {
+    setLoading(true)
+    try {
+      const query = {
+        ...state.queryData,
+        pageIndex: tablePagination.currentPage,
+        pageSize: tablePagination.pageSize
+      }
+      const res = await getList(query)
+      if (res.code === SuccessResultCode) {
+        setPagination(res.data)
+      } else {
+        ElMessage.error(res.message || '查询失败')
+      }
+    } catch (error) {
+      console.error('查询失败:', error)
+      ElMessage.error('查询失败')
+    } finally {
+      setLoading(false)
+    }
+  }
+
+      #if($table.sub)
+      // 子表相关方法
+      function row${subClassName}Index({ row, rowIndex }: any) {
+        row.index = rowIndex + 1
+      }
+
+      function handleAdd${subClassName}() {
+        const obj: any = {}
+          #foreach($column in $subTable.columns)
+              #if(!$column.pk && $column.javaField != ${subTableFkclassName})
+                obj.${column.javaField} = ''
+              #end
+          #end
+        state.${subclassName}List.push(obj)
+      }
+
+      function handleDelete${subClassName}() {
+        if (state.checked${subClassName}.length === 0) {
+          ElMessage.warning('请先选择要删除的数据')
+          return
+        }
+        state.${subclassName}List = state.${subclassName}List.filter(item =>
+            !state.checked${subClassName}.includes(item.index)
+        )
+        state.checked${subClassName} = []
+      }
+
+      function handle${subClassName}SelectionChange(selection: any[]) {
+        state.checked${subClassName} = selection.map(item => item.index)
+      }
+      #end
+
+  // 组件挂载时加载数据
+  onMounted(() => {
+    onLoadData()
+  })
 </script>
+
+<style scoped>
+  /* 自定义样式 */
+</style>

+ 1 - 1
wxjy-wxjy-service/src/main/resources/vm-xiong/xml/dao.xml.vm → wxjy-wxjy-service/src/main/resources/vm/xml/dao.xml.vm

@@ -15,7 +15,7 @@
         from ${tableName}
     </sql>
 
-    <select id="selectList" parameterType="${ClassName}" resultMap="${ClassName}Result">
+    <select id="selectList" parameterType="${ClassName}Query" resultMap="${ClassName}Result">
         <include refid="baseVo"/>
         <where>
     #foreach($column in $columns)

+ 0 - 155
wxjy-wxjy-service/src/main/resources/vm/xml/mapper.xml.vm

@@ -1,155 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="${packageName}.mapper.${ClassName}Mapper">
-
-    <resultMap type="${ClassName}" id="${ClassName}Result">
-        #foreach ($column in $columns)
-            <result property="${column.javaField}" column="${column.columnName}"/>
-        #end
-    </resultMap>
-
-    <sql id="baseVo">
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end
-        from ${tableName}
-    </sql>
-
-    <select id="getPageList" parameterType="${ClassName}Query" resultMap="${ClassName}Result">
-        <include refid="baseVo"/>
-        <where>
-    #foreach($column in $columns)
-    #set($queryType=$column.queryType)
-    #set($javaField=$column.javaField)
-    #set($javaType=$column.javaType)
-    #set($columnName=$column.columnName)
-    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-    #if($column.query)
-    #if($column.queryType == "EQ")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName = #{$javaField}
-        </if>
-    #elseif($queryType == "NE")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName != #{$javaField}
-        </if>
-    #elseif($queryType == "GT")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName &gt; #{$javaField}
-        </if>
-    #elseif($queryType == "GTE")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName &gt;= #{$javaField}
-        </if>
-    #elseif($queryType == "LT")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName &lt; #{$javaField}
-        </if>
-    #elseif($queryType == "LTE")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName &lt;= #{$javaField}
-        </if>
-    #elseif($queryType == "LIKE")
-        <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end">
-            and $columnName like concat('%', #{$javaField}, '%')
-        </if>
-    #elseif($queryType == "BETWEEN")
-        <if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''">
-            and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}
-        </if>
-    #end
-    #end
-    #end
-        </where>
-    </select>
-
-    <select id="getDetail" parameterType="java.lang.${pkColumn.javaType}"
-        resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
-    #if($table.crud || $table.tree)
-        <include refid="baseVo"/>
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    #elseif($table.sub)
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end
-        from ${tableName}
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    #end
-    </select>
-
-##    <insert id="insert" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true"
-##            keyProperty="$pkColumn.javaField"#end>
-##        insert into ${tableName}
-##        <trim prefix="(" suffix=")" suffixOverrides=",">
-##    #foreach($column in $columns)
-##        #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-##            <if test="$column.javaField != null#if($column.javaType ==
-##                'String' && $column.required) and $column.javaField != ''#end">$column.columnName,
-##            </if>
-##        #end
-##    #end
-##        </trim>
-##        <trim prefix="values (" suffix=")" suffixOverrides=",">
-##    #foreach($column in $columns)
-##        #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-##            <if test="$column.javaField != null#if($column.javaType ==
-##                'String' && $column.required) and $column.javaField != ''#end">#{$column.javaField},
-##            </if>
-##        #end
-##    #end
-##        </trim>
-##    </insert>
-##
-##    <update id="update" parameterType="${ClassName}">
-##        update ${tableName}
-##        <trim prefix="SET" suffixOverrides=",">
-##    #foreach($column in $columns)
-##        #if($column.columnName != $pkColumn.columnName)
-##            <if test="$column.javaField != null#if($column.javaType ==
-##                'String' && $column.required) and $column.javaField != ''#end">$column.columnName =
-##                #{$column.javaField},
-##            </if>
-##        #end
-##    #end
-##        </trim>
-##        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-##    </update>
-##
-##    <delete id="deleteBy${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}">
-##        delete
-##        from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-##    </delete>
-##
-##    <delete id="deleteBy${pkColumn.capJavaField}s" parameterType="String">
-##        delete from ${tableName} where ${pkColumn.columnName} in
-##        <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
-##            #{${pkColumn.javaField}}
-##        </foreach>
-##    </delete>
-##    #if($table.sub)
-##
-##        <delete id="deleteBy${subTableFkClassName}s" parameterType="String">
-##            delete from ${subTableName} where ${subTableFkName} in
-##            <foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
-##                #{${subTableFkclassName}}
-##            </foreach>
-##        </delete>
-##
-##        <delete id="deleteBy${subTableFkClassName}" parameterType="${pkColumn.javaType}">
-##            delete
-##            from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}}
-##        </delete>
-##
-##        <insert id="batch">
-##            insert into ${subTableName}
-##            (#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size())
-##            ,#end#end) values
-##            <foreach item="item" index="index" collection="list" separator=",">
-##                (#foreach($column in $subTable.columns) #{item.$column.javaField
-##                }#if($foreach.count != $subTable.columns.size()),#end#end)
-##            </foreach>
-##        </insert>
-##    #end
-##
-##    <delete id="logicDelete" parameterType="${pkColumn.javaType}">
-##        update  ${tableName} set is_del = 1  where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-##    </delete>
-</mapper>

+ 1 - 0
wxjy-wxjy-web/package.json

@@ -30,6 +30,7 @@
     "dayjs": "1.11.13",
     "echarts": "5.5.1",
     "element-plus": "2.8.6",
+    "highlight.js": "^11.11.1",
     "js-file-download": "0.4.12",
     "lodash-es": "4.17.21",
     "nanoid": "5.0.8",

+ 32 - 1
wxjy-wxjy-web/src/App.vue

@@ -10,6 +10,29 @@
           </el-menu-item>
         </router-link>
 
+        <el-sub-menu index="analyze">  <!-- index 为父菜单唯一标识(非路由路径) -->
+          <template #title>
+            <el-icon><Setting /></el-icon>  <!-- 父菜单图标 -->
+            <span>可视化分析</span>  <!-- 父菜单名称 -->
+          </template>
+          <router-link to="/analyze-newDeclaredGoods">
+            <el-menu-item index="NewDeclaredGoods" class="menu-item">
+              <el-icon>
+                <ScaleToOriginal />
+              </el-icon>
+              <span>事后通知</span>
+            </el-menu-item>
+          </router-link>
+          <router-link to="/analyze-entryHead">
+            <el-menu-item index="EntryHead" class="menu-item">
+              <el-icon>
+                <ScaleToOriginal />
+              </el-icon>
+              <span>表头信息</span>
+            </el-menu-item>
+          </router-link>
+        </el-sub-menu>
+
         <router-link to="/user-info">
           <el-menu-item index="UserInfo">
             <el-icon><User /></el-icon>
@@ -30,8 +53,16 @@
               <span>字典管理</span>
             </el-menu-item>
           </router-link>
+          <router-link to="/gen-index">
+            <el-menu-item index="gen-index" class="menu-item">
+              <el-icon>
+                <ScaleToOriginal />
+              </el-icon>
+              <span>代码生成</span>
+            </el-menu-item>
+          </router-link>
         </el-sub-menu>
-        
+
       </el-menu>
     </el-aside>
     <el-container class="content">

+ 41 - 0
wxjy-wxjy-web/src/apis/analyze/EntryHead.ts

@@ -0,0 +1,41 @@
+import type { AxiosResponse } from 'axios'
+import type { PageInfo, Result } from '@cacp/ui'
+import request from '@/utils/request'
+
+import type {EntryHead,EntryHeadQuery}  from '@/types/analyze/EntryHead'
+
+const contextPath = '/analyze/EntryHead'
+
+// 查询危险品报关单头列表
+export async function getList(query: EntryHeadQuery): Promise<Result<PageInfo<EntryHead>>> {
+  const res: AxiosResponse<Result<PageInfo<EntryHead>>> = await request.post(`${contextPath}/get-list`, query)
+  return res.data
+}
+
+// 获取采购入库单详情
+export async function getDetail(entryId: string): Promise<Result<EntryHead>> {
+  const res: AxiosResponse<Result<EntryHead>> = await request.get(`${contextPath}/get-detail?entryId=${entryId}`)
+  return res.data
+}
+
+// 新增采购入库单
+export async function insert(row: EntryHead): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/insert-entryHead`, row)
+  return res.data
+}
+
+// 更新采购入库单
+export async function update(row: EntryHead): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/update-entryHead`, row)
+  return res.data
+}
+
+// 删除采购入库单
+export async function remove(entryHeads: string | string[]): Promise<Result<number>> {
+  // 统一转换为数组格式
+  const ids = Array.isArray(entryHeads) ? entryHeads : [entryHeads];
+  const res: AxiosResponse<Result<number>> = await request.post(
+          `${contextPath}/delete-entryHead?ids`,ids
+  )
+  return res.data
+}

+ 41 - 0
wxjy-wxjy-web/src/apis/analyze/NewDeclaredGoods.ts

@@ -0,0 +1,41 @@
+import type { AxiosResponse } from 'axios'
+import type { PageInfo, Result } from '@cacp/ui'
+import request from '@/utils/request'
+
+import type {NewDeclaredGoods,NewDeclaredGoodsQuery}  from '@/types/analyze/NewDeclaredGoods'
+
+const contextPath = '/analyze/NewDeclaredGoods'
+
+// 查询新申报商品提示列表
+export async function getList(query: NewDeclaredGoodsQuery): Promise<Result<PageInfo<NewDeclaredGoods>>> {
+  const res: AxiosResponse<Result<PageInfo<NewDeclaredGoods>>> = await request.post(`${contextPath}/get-list`, query)
+  return res.data
+}
+
+// 获取采购入库单详情
+export async function getDetail(ID: string): Promise<Result<NewDeclaredGoods>> {
+  const res: AxiosResponse<Result<NewDeclaredGoods>> = await request.get(`${contextPath}/get-detail?ID=${ID}`)
+  return res.data
+}
+
+// 新增采购入库单
+export async function insert(row: NewDeclaredGoods): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/insert-newDeclaredGoods`, row)
+  return res.data
+}
+
+// 更新采购入库单
+export async function update(row: NewDeclaredGoods): Promise<Result<number>> {
+  const res: AxiosResponse<Result<number>> = await request.post(`${contextPath}/update-newDeclaredGoods`, row)
+  return res.data
+}
+
+// 删除采购入库单
+export async function remove(newDeclaredGoodss: string | string[]): Promise<Result<number>> {
+  // 统一转换为数组格式
+  const ids = Array.isArray(newDeclaredGoodss) ? newDeclaredGoodss : [newDeclaredGoodss];
+  const res: AxiosResponse<Result<number>> = await request.post(
+          `${contextPath}/delete-newDeclaredGoods?ids`,ids
+  )
+  return res.data
+}

+ 1 - 1
wxjy-wxjy-web/src/apis/gen/gen.ts

@@ -1,6 +1,6 @@
 // api/tool/gen.ts
 import type { AxiosResponse } from 'axios'
-import type { PageInfo, Result, TypeDescriptor } from '@cacp/ui'
+import type { PageInfo, Result } from '@cacp/ui'
 import request from '@/utils/request'
 
 // 类型定义

+ 171 - 0
wxjy-wxjy-web/src/components/RightToolbar/index.vue

@@ -0,0 +1,171 @@
+<!--<template>-->
+<!--  <div class="top-right-btn" :style="style">-->
+<!--    <el-row>-->
+<!--      <el-tooltip-->
+<!--        class="item"-->
+<!--        effect="dark"-->
+<!--        :content="showSearch ? '隐藏搜索' : '显示搜索'"-->
+<!--        placement="top"-->
+<!--        v-if="search"-->
+<!--      >-->
+<!--        <el-button size="small" circle icon="Search" @click="toggleSearch()" />-->
+<!--      </el-tooltip>-->
+<!--      <el-tooltip class="item" effect="dark" content="刷新" placement="top">-->
+<!--        <el-button size="small" circle icon="Refresh" @click="refresh()" />-->
+<!--      </el-tooltip>-->
+<!--      <el-tooltip-->
+<!--        class="item"-->
+<!--        effect="dark"-->
+<!--        content="显隐列"-->
+<!--        placement="top"-->
+<!--        v-if="columns"-->
+<!--      >-->
+<!--        <el-button-->
+<!--          size="small"-->
+<!--          circle-->
+<!--          icon="Menu"-->
+<!--          @click="showColumn()"-->
+<!--          v-if="showColumnsType == 'transfer'"-->
+<!--        />-->
+<!--        <el-dropdown-->
+<!--          trigger="click"-->
+<!--          :hide-on-click="false"-->
+<!--          style="padding-left: 12px"-->
+<!--          v-if="showColumnsType == 'checkbox'"-->
+<!--        >-->
+<!--          <el-button size="small" circle icon="Menu" />-->
+<!--          <template #dropdown>-->
+<!--            <el-dropdown-menu>-->
+<!--              <el-dropdown-item v-for="item in columns" :key="item.key">-->
+<!--                <el-checkbox-->
+<!--                  :checked="item.visible"-->
+<!--                  @change="checkboxChange($event, item.label)"-->
+<!--                  :label="item.label"-->
+<!--                />-->
+<!--              </el-dropdown-item>-->
+<!--            </el-dropdown-menu>-->
+<!--          </template>-->
+<!--        </el-dropdown>-->
+<!--      </el-tooltip>-->
+<!--    </el-row>-->
+<!--    <el-dialog :title="title" v-model="open" append-to-body>-->
+<!--      <el-transfer-->
+<!--        :titles="['显示', '隐藏']"-->
+<!--        v-model="value"-->
+<!--        :data="columns"-->
+<!--        @change="dataChange"-->
+<!--      ></el-transfer>-->
+<!--    </el-dialog>-->
+<!--  </div>-->
+<!--</template>-->
+
+<!--<script setup lang="ts">-->
+<!--import { ref, computed, onMounted } from 'vue'-->
+
+<!--// 定义类型-->
+<!--interface Column {-->
+<!--  key: string | number-->
+<!--  label: string-->
+<!--  visible: boolean-->
+<!--  [key: string]: any-->
+<!--}-->
+
+<!--interface Props {-->
+<!--  /* 是否显示检索条件 */-->
+<!--  showSearch?: boolean-->
+<!--  /* 显隐列信息 */-->
+<!--  columns?: Column[]-->
+<!--  /* 是否显示检索图标 */-->
+<!--  search?: boolean-->
+<!--  /* 显隐列类型(transfer穿梭框、checkbox复选框) */-->
+<!--  showColumnsType?: string-->
+<!--  /* 右外边距 */-->
+<!--  gutter?: number-->
+<!--}-->
+
+<!--interface Emits {-->
+<!--  (e: 'update:showSearch', value: boolean): void-->
+<!--  (e: 'queryTable'): void-->
+<!--}-->
+
+<!--// 定义props和emits-->
+<!--const props = withDefaults(defineProps<Props>(), {-->
+<!--  showSearch: true,-->
+<!--  columns: () => [],-->
+<!--  search: true,-->
+<!--  showColumnsType: 'checkbox',-->
+<!--  gutter: 10-->
+<!--})-->
+
+<!--const emit = defineEmits<Emits>()-->
+
+<!--// 响应式数据-->
+<!--const value = ref<(string | number)[]>([])-->
+<!--const title = ref("显示/隐藏")-->
+<!--const open = ref(false)-->
+
+<!--// 计算属性-->
+<!--const style = computed(() => {-->
+<!--  const ret: { marginRight?: string } = {}-->
+<!--  if (props.gutter) {-->
+<!--    ret.marginRight = `${props.gutter / 2}px`-->
+<!--  }-->
+<!--  return ret-->
+<!--})-->
+
+<!--// 生命周期-->
+<!--onMounted(() => {-->
+<!--  if (props.showColumnsType == 'transfer') {-->
+<!--    // 显隐列初始默认隐藏列-->
+<!--    props.columns?.forEach((item, index) => {-->
+<!--      if (item.visible === false) {-->
+<!--        value.value.push(index)-->
+<!--      }-->
+<!--    })-->
+<!--  }-->
+<!--})-->
+
+<!--// 方法-->
+<!--// 搜索-->
+<!--const toggleSearch = () => {-->
+<!--  emit('update:showSearch', !props.showSearch)-->
+<!--}-->
+
+<!--// 刷新-->
+<!--const refresh = () => {-->
+<!--  emit('queryTable')-->
+<!--}-->
+
+<!--// 右侧列表元素变化-->
+<!--const dataChange = (data: (string | number)[]) => {-->
+<!--  props.columns?.forEach((item) => {-->
+<!--    const key = item.key-->
+<!--    item.visible = !data.includes(key)-->
+<!--  })-->
+<!--}-->
+
+<!--// 打开显隐列dialog-->
+<!--const showColumn = () => {-->
+<!--  open.value = true-->
+<!--}-->
+
+<!--// 勾选-->
+<!--const checkboxChange = (event: boolean, label: string) => {-->
+<!--  const column = props.columns?.find(item => item.label === label)-->
+<!--  if (column) {-->
+<!--    column.visible = event-->
+<!--  }-->
+<!--}-->
+<!--</script>-->
+
+<!--<style lang="scss" scoped>-->
+<!--:deep(.el-transfer__button) {-->
+<!--  border-radius: 50%;-->
+<!--  padding: 12px;-->
+<!--  display: block;-->
+<!--  margin-left: 0px;-->
+<!--}-->
+<!--:deep(.el-transfer__button:first-child) {-->
+<!--  margin-bottom: 10px;-->
+<!--}-->
+<!--</style>-->

+ 30 - 0
wxjy-wxjy-web/src/router/app-router.ts

@@ -30,6 +30,36 @@ const routers: Array<RouteRecordRaw> = [
       permissions:"DICT_TYPE_VIEW_BT"
     }
   },
+  {
+    path: '/gen-index',
+    name: 'GenIndex',
+    component: () => import('@/views/gen/genIndex.vue'),
+    meta: {
+      title: '代码生成'
+    }
+  },
+  {
+    path: '/gen-edit/:tableId', // 确保这个路由存在
+    component: () => import('@/views/gen/editTable.vue'), // 确认组件路径正确
+    name: 'GenEdit',
+    meta: { title: '编辑生成配置', activeMenu: '/gen/index' },
+  },
+  {
+    path: '/analyze-entryHead',
+    name: 'EntryHead',
+    component: () => import('@/views/analyze/EntryHead.vue'),
+    meta: {
+      title: '表头',
+    }
+  },
+  {
+    path: '/analyze-newDeclaredGoods',
+    name: 'NewDeclaredGoods',
+    component: () => import('@/views/analyze/NewDeclaredGoods.vue'),
+    meta: {
+      title: '事后通知',
+    }
+  },
 ]
 
 export default routers

+ 122 - 0
wxjy-wxjy-web/src/types/analyze/EntryHead.ts

@@ -0,0 +1,122 @@
+// 危险品报关单头
+export interface EntryHead {
+  entryId?: string
+  mainStatus?: string
+  passMode?: string
+  trafMode?: string
+  iEFlag?: string
+  iEPort?: string
+  declPort?: string
+  iEDate?: string
+  declDate?: string
+  declAdvanceFlag?: string
+  acceptDate?: string
+  exInPortDate?: string
+  consignScc?: string
+  consignCode?: string
+  consignName?: string
+  frnConsignCode?: string
+  frnConsignName?: string
+  tradeMode?: string
+  tradeCountry?: string
+  grossWt?: string
+  netWt?: string
+  rmbPrice?: string
+  usdPrice?: string
+  CONTAINER?: string
+  declMode?: string
+  declStatus?: string
+  orderReceiveDate?: string
+  orderReceiveCost?: string
+  certRlsDate?: string
+  preReleaseDate?: string
+  agentCode?: string
+  agentName?: string
+  noteS?: string
+  ownerCode?: string
+  ownerName?: string
+  examDate?: string
+  checkDate?: string
+  compEleDate?: string
+  releaseDate?: string
+  cuCost?: string
+  totalCost?: string
+  beforeDeclCost?: string
+  profVerifyFlag?: string
+  newTwoStepFlag?: string
+  eleDeclDate?: string
+  assessStartDate?: string
+  assessEndDate?: string
+  refundDate?: string
+  refundFlag?: string
+  manCreateTime?: string
+  manChkTimeStart?: string
+  manChkTimeEnd?: string
+  checkCustomsCode?: string
+  checkFlag?: string
+  manProcResult?: string
+  manProcIdea?: string
+}
+
+// 危险品报关单头查询参数
+export interface EntryHeadQuery {
+  mainStatus?: string
+  passMode?: string
+  trafMode?: string
+  iEFlag?: string
+  iEPort?: string
+  declPort?: string
+  iEDate?: string
+  declDate?: string
+  declAdvanceFlag?: string
+  acceptDate?: string
+  exInPortDate?: string
+  consignScc?: string
+  consignCode?: string
+  consignName?: string
+  frnConsignCode?: string
+  frnConsignName?: string
+  tradeMode?: string
+  tradeCountry?: string
+  grossWt?: string
+  netWt?: string
+  rmbPrice?: string
+  usdPrice?: string
+  CONTAINER?: string
+  declMode?: string
+  declStatus?: string
+  orderReceiveDate?: string
+  orderReceiveCost?: string
+  certRlsDate?: string
+  preReleaseDate?: string
+  agentCode?: string
+  agentName?: string
+  noteS?: string
+  ownerCode?: string
+  ownerName?: string
+  examDate?: string
+  checkDate?: string
+  compEleDate?: string
+  releaseDate?: string
+  cuCost?: string
+  totalCost?: string
+  beforeDeclCost?: string
+  profVerifyFlag?: string
+  newTwoStepFlag?: string
+  eleDeclDate?: string
+  assessStartDate?: string
+  assessEndDate?: string
+  refundDate?: string
+  refundFlag?: string
+  manCreateTime?: string
+  manChkTimeStart?: string
+  manChkTimeEnd?: string
+  checkCustomsCode?: string
+  checkFlag?: string
+  manProcResult?: string
+  manProcIdea?: string
+  beginDate?: string
+  endDate?: string
+  pageIndex?: number
+  pageSize?: number
+}

+ 128 - 0
wxjy-wxjy-web/src/types/analyze/NewDeclaredGoods.ts

@@ -0,0 +1,128 @@
+// 新申报商品提示
+export interface NewDeclaredGoods {
+  ID?: string
+  entryId?: string
+  gNo?: string
+  ieFlag?: string
+  iePort?: string
+  declPort?: string
+  customsCode?: string
+  declDate?: string
+  consignScc?: string
+  consignCode?: string
+  consignName?: string
+  codeTs?: string
+  iqCode?: string
+  gName?: string
+  iqGName?: string
+  gNameFn?: string
+  gModel?: string
+  iqGModel?: string
+  gComposition?: string
+  prodWarranty?: string
+  prodValidaty?: string
+  dutyMode?: string
+  GTIN?: string
+  gQty?: string
+  gUnit?: string
+  qty1?: string
+  unit1?: string
+  qty2?: string
+  unit2?: string
+  declPrice?: string
+  declTotal?: string
+  tradeCurr?: string
+  tradeTotal?: string
+  dutyValue?: string
+  rmbPrice?: string
+  usdPrice?: string
+  exchangeRate?: string
+  originCountry?: string
+  originRegionCode?: string
+  destCountry?: string
+  ieDistrictCode?: string
+  iqIeDistrictCode?: string
+  frnProducerName?: string
+  productModel?: string
+  productBrand?: string
+  productDate?: string
+  productBatch?: string
+  UNGID?: string
+  ungFlag?: string
+  ungModel?: string
+  ungClassify?: string
+  ungGName?: string
+  productCharCode?: string
+  goodsId?: string
+  useTo?: string
+  gCertFlag?: string
+  mnufctrRegNo?: string
+  CAS?: string
+  goodsType?: string
+}
+
+// 新申报商品提示查询参数
+export interface NewDeclaredGoodsQuery {
+  entryId?: string
+  gNo?: string
+  ieFlag?: string
+  iePort?: string
+  declPort?: string
+  customsCode?: string
+  declDate?: string
+  consignScc?: string
+  consignCode?: string
+  consignName?: string
+  codeTs?: string
+  iqCode?: string
+  gName?: string
+  iqGName?: string
+  gNameFn?: string
+  gModel?: string
+  iqGModel?: string
+  gComposition?: string
+  prodWarranty?: string
+  prodValidaty?: string
+  dutyMode?: string
+  GTIN?: string
+  gQty?: string
+  gUnit?: string
+  qty1?: string
+  unit1?: string
+  qty2?: string
+  unit2?: string
+  declPrice?: string
+  declTotal?: string
+  tradeCurr?: string
+  tradeTotal?: string
+  dutyValue?: string
+  rmbPrice?: string
+  usdPrice?: string
+  exchangeRate?: string
+  originCountry?: string
+  originRegionCode?: string
+  destCountry?: string
+  ieDistrictCode?: string
+  iqIeDistrictCode?: string
+  frnProducerName?: string
+  productModel?: string
+  productBrand?: string
+  productDate?: string
+  productBatch?: string
+  UNGID?: string
+  ungFlag?: string
+  ungModel?: string
+  ungClassify?: string
+  ungGName?: string
+  productCharCode?: string
+  goodsId?: string
+  useTo?: string
+  gCertFlag?: string
+  mnufctrRegNo?: string
+  CAS?: string
+  goodsType?: string
+  beginDate?: string
+  endDate?: string
+  pageIndex?: number
+  pageSize?: number
+}

+ 1178 - 0
wxjy-wxjy-web/src/views/analyze/EntryHead.vue

@@ -0,0 +1,1178 @@
+<template>
+  <cacp-search-layout>
+    <template #search>
+      <cacp-search-panel-layout
+        :model="state.queryData"
+        ref="queryFormRef"
+        label-position="left"
+        label-width="auto"
+        :gutter="30"
+        :colSpan="6"
+      >
+        <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="120"
+      @selection-change="handleSelectionChange"
+      @on-page-change="onPageChange"
+      @on-size-change="onSizeChange"
+      :loading="loading"
+    >
+      <el-table-column type="selection" width="36" fixed="left" />
+      <el-table-column property="entryId" label="报关单号" width="100" :show-overflow-tooltip="true" />
+      <el-table-column property="mainStatus" label="维护状态" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="passMode" label="通关模式" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="trafMode" label="运输方式" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iEFlag" label="出入境标志" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iEPort" label="进出境口岸" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declPort" label="申报口岸" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iEDate" label="货物运抵(进出口)时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declDate" label="申报时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declAdvanceFlag" label="是否提前申报标记" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="acceptDate" label="自动受理时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="exInPortDate" label="出境报关单-货物进港时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignScc" label="境内收发货人代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignCode" label="境内收发货人代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignName" label="境内收发货人名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="frnConsignCode" label="境外收发货人代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="frnConsignName" label="境外收发货人名称(中文)" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="tradeMode" label="监管方式" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="tradeCountry" label="贸易国别代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="grossWt" label="货运量毛重" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="netWt" label="货运量净重" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="rmbPrice" label="货运值人民币" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="usdPrice" label="货运值美元" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="CONTAINER" label="集装箱数量" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declMode" label="报关模式" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declStatus" label="报关单状态" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="orderReceiveDate" label="现场接单时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="orderReceiveCost" label="接单耗时即单证审核时长(秒)" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="certRlsDate" label="单证放行时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="preReleaseDate" label="担保放行时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="agentCode" label="申报单位代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="agentName" label="申报单位名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="noteS" label="备注" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ownerCode" label="生产销售单位代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ownerName" label="生产销售单位名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="examDate" label="转关数据发送时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="checkDate" label="转关数据核销时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="compEleDate" label="完整申报电子申报时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="releaseDate" label="结关时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="cuCost" label="海关通关时间(秒)" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="totalCost" label="总体通关时间(秒)" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="beforeDeclCost" label="申报前准备时间(秒)" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="profVerifyFlag" label="是否专业审单" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="newTwoStepFlag" label="是否新两步申报标记" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="eleDeclDate" label="电子申报时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="assessStartDate" label="现场验估时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="assessEndDate" label="验估处置完毕时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="refundDate" label="退单时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="refundFlag" label="是否退过单标记" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="manCreateTime" label="查验指令下达时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="manChkTimeStart" label="查验开始时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="manChkTimeEnd" label="查验结束时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="checkCustomsCode" label="查验关区" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="checkFlag" label="是否查验" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="manProcResult" label="处理结果" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="manProcIdea" label="处理意见" width="120" :show-overflow-tooltip="true" />
+    </cacp-complex-table>
+  </cacp-search-layout>
+
+  <cacp-dialog
+    v-model="state.dialogVisible"
+    :resizable="false"
+    :title="state.title"
+    width="60%"
+    @closed="onDialogClosed"
+  >
+    <el-form
+      :model="state.formData"
+      ref="dialogFormRef"
+      :rules="infoRules"
+      label-width="auto"
+      label-position="left"
+      :disabled="!state.isEdit"
+    >
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="维护状态" prop="mainStatus">
+            <el-input v-model="state.formData.mainStatus" placeholder="请输入维护状态" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="通关模式" prop="passMode">
+            <el-input v-model="state.formData.passMode" placeholder="请输入通关模式" />
+          </el-form-item>
+        </el-col>
+      </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="运输方式" prop="trafMode">
+          <el-input v-model="state.formData.trafMode" placeholder="请输入运输方式" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="出入境标志" prop="iEFlag">
+          <el-input v-model="state.formData.iEFlag" placeholder="请输入出入境标志" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="进出境口岸" prop="iEPort">
+          <el-input v-model="state.formData.iEPort" placeholder="请输入进出境口岸" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报口岸" prop="declPort">
+          <el-input v-model="state.formData.declPort" placeholder="请输入申报口岸" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货物运抵(进出口)时间" prop="iEDate">
+          <el-input v-model="state.formData.iEDate" placeholder="请输入货物运抵(进出口)时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报时间" prop="declDate">
+          <el-input v-model="state.formData.declDate" placeholder="请输入申报时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否提前申报标记" prop="declAdvanceFlag">
+          <el-input v-model="state.formData.declAdvanceFlag" placeholder="请输入是否提前申报标记" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="自动受理时间" prop="acceptDate">
+          <el-input v-model="state.formData.acceptDate" placeholder="请输入自动受理时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="出境报关单-货物进港时间" prop="exInPortDate">
+          <el-input v-model="state.formData.exInPortDate" placeholder="请输入出境报关单-货物进港时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码" prop="consignScc">
+          <el-input v-model="state.formData.consignScc" placeholder="请输入境内收发货人代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码" prop="consignCode">
+          <el-input v-model="state.formData.consignCode" placeholder="请输入境内收发货人代码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人名称" prop="consignName">
+          <el-input v-model="state.formData.consignName" placeholder="请输入境内收发货人名称" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境外收发货人代码" prop="frnConsignCode">
+          <el-input v-model="state.formData.frnConsignCode" placeholder="请输入境外收发货人代码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境外收发货人名称(中文)" prop="frnConsignName">
+          <el-input v-model="state.formData.frnConsignName" placeholder="请输入境外收发货人名称(中文)" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="监管方式" prop="tradeMode">
+          <el-input v-model="state.formData.tradeMode" placeholder="请输入监管方式" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="贸易国别代码" prop="tradeCountry">
+          <el-input v-model="state.formData.tradeCountry" placeholder="请输入贸易国别代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货运量毛重" prop="grossWt">
+          <el-input v-model="state.formData.grossWt" placeholder="请输入货运量毛重" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货运量净重" prop="netWt">
+          <el-input v-model="state.formData.netWt" placeholder="请输入货运量净重" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货运值人民币" prop="rmbPrice">
+          <el-input v-model="state.formData.rmbPrice" placeholder="请输入货运值人民币" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货运值美元" prop="usdPrice">
+          <el-input v-model="state.formData.usdPrice" placeholder="请输入货运值美元" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="集装箱数量" prop="CONTAINER">
+          <el-input v-model="state.formData.CONTAINER" placeholder="请输入集装箱数量" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="报关模式" prop="declMode">
+          <el-input v-model="state.formData.declMode" placeholder="请输入报关模式" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="报关单状态" prop="declStatus">
+          <el-input v-model="state.formData.declStatus" placeholder="请输入报关单状态" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="现场接单时间" prop="orderReceiveDate">
+          <el-input v-model="state.formData.orderReceiveDate" placeholder="请输入现场接单时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="接单耗时即单证审核时长(秒)" prop="orderReceiveCost">
+          <el-input v-model="state.formData.orderReceiveCost" placeholder="请输入接单耗时即单证审核时长(秒)" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="单证放行时间" prop="certRlsDate">
+          <el-input v-model="state.formData.certRlsDate" placeholder="请输入单证放行时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="担保放行时间" prop="preReleaseDate">
+          <el-input v-model="state.formData.preReleaseDate" placeholder="请输入担保放行时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报单位代码" prop="agentCode">
+          <el-input v-model="state.formData.agentCode" placeholder="请输入申报单位代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报单位名称" prop="agentName">
+          <el-input v-model="state.formData.agentName" placeholder="请输入申报单位名称" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="备注" prop="noteS">
+          <el-input v-model="state.formData.noteS" placeholder="请输入备注" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="生产销售单位代码" prop="ownerCode">
+          <el-input v-model="state.formData.ownerCode" placeholder="请输入生产销售单位代码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产销售单位名称" prop="ownerName">
+          <el-input v-model="state.formData.ownerName" placeholder="请输入生产销售单位名称" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="转关数据发送时间" prop="examDate">
+          <el-input v-model="state.formData.examDate" placeholder="请输入转关数据发送时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="转关数据核销时间" prop="checkDate">
+          <el-input v-model="state.formData.checkDate" placeholder="请输入转关数据核销时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="完整申报电子申报时间" prop="compEleDate">
+          <el-input v-model="state.formData.compEleDate" placeholder="请输入完整申报电子申报时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="结关时间" prop="releaseDate">
+          <el-input v-model="state.formData.releaseDate" placeholder="请输入结关时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="海关通关时间(秒)" prop="cuCost">
+          <el-input v-model="state.formData.cuCost" placeholder="请输入海关通关时间(秒)" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="总体通关时间(秒)" prop="totalCost">
+          <el-input v-model="state.formData.totalCost" placeholder="请输入总体通关时间(秒)" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报前准备时间(秒)" prop="beforeDeclCost">
+          <el-input v-model="state.formData.beforeDeclCost" placeholder="请输入申报前准备时间(秒)" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否专业审单" prop="profVerifyFlag">
+          <el-input v-model="state.formData.profVerifyFlag" placeholder="请输入是否专业审单" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否新两步申报标记" prop="newTwoStepFlag">
+          <el-input v-model="state.formData.newTwoStepFlag" placeholder="请输入是否新两步申报标记" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="电子申报时间" prop="eleDeclDate">
+          <el-input v-model="state.formData.eleDeclDate" placeholder="请输入电子申报时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="现场验估时间" prop="assessStartDate">
+          <el-input v-model="state.formData.assessStartDate" placeholder="请输入现场验估时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="验估处置完毕时间" prop="assessEndDate">
+          <el-input v-model="state.formData.assessEndDate" placeholder="请输入验估处置完毕时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="退单时间" prop="refundDate">
+          <el-input v-model="state.formData.refundDate" placeholder="请输入退单时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否退过单标记" prop="refundFlag">
+          <el-input v-model="state.formData.refundFlag" placeholder="请输入是否退过单标记" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="查验指令下达时间" prop="manCreateTime">
+          <el-input v-model="state.formData.manCreateTime" placeholder="请输入查验指令下达时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="查验开始时间" prop="manChkTimeStart">
+          <el-input v-model="state.formData.manChkTimeStart" placeholder="请输入查验开始时间" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="查验结束时间" prop="manChkTimeEnd">
+          <el-input v-model="state.formData.manChkTimeEnd" placeholder="请输入查验结束时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="查验关区" prop="checkCustomsCode">
+          <el-input v-model="state.formData.checkCustomsCode" placeholder="请输入查验关区" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否查验" prop="checkFlag">
+          <el-input v-model="state.formData.checkFlag" placeholder="请输入是否查验" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="处理结果" prop="manProcResult">
+          <el-input v-model="state.formData.manProcResult" placeholder="请输入处理结果" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="处理意见" prop="manProcIdea">
+          <el-input v-model="state.formData.manProcIdea" placeholder="请输入处理意见" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    </el-form>
+    <template #footer v-if="state.isEdit">
+      <el-button @click="onDialogClosed">取消</el-button>
+      <el-button type="primary" @click="onSubmit">确定</el-button>
+    </template>
+  </cacp-dialog>
+
+  <cacp-dialog
+    v-model="state.viewDialogVisible"
+    :resizable="false"
+    :title="state.viewTitle"
+    width="50%"
+  >
+    <el-form
+      :model="state.viewForm"
+      label-width="auto"
+      label-position="left"
+      :disabled="true"
+    >
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="维护状态:" prop="mainStatus">
+            <span>{{ state.viewForm.mainStatus || '-' }}</span>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="通关模式:" prop="passMode">
+            <span>{{ state.viewForm.passMode || '-' }}</span>
+          </el-form-item>
+        </el-col>
+      </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="运输方式:" prop="trafMode">
+          <span>{{ state.viewForm.trafMode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="出入境标志:" prop="iEFlag">
+          <span>{{ state.viewForm.iEFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="进出境口岸:" prop="iEPort">
+          <span>{{ state.viewForm.iEPort || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报口岸:" prop="declPort">
+          <span>{{ state.viewForm.declPort || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货物运抵(进出口)时间:" prop="iEDate">
+          <span>{{ state.viewForm.iEDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报时间:" prop="declDate">
+          <span>{{ state.viewForm.declDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否提前申报标记:" prop="declAdvanceFlag">
+          <span>{{ state.viewForm.declAdvanceFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="自动受理时间:" prop="acceptDate">
+          <span>{{ state.viewForm.acceptDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="出境报关单-货物进港时间:" prop="exInPortDate">
+          <span>{{ state.viewForm.exInPortDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码:" prop="consignScc">
+          <span>{{ state.viewForm.consignScc || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码:" prop="consignCode">
+          <span>{{ state.viewForm.consignCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人名称:" prop="consignName">
+          <span>{{ state.viewForm.consignName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境外收发货人代码:" prop="frnConsignCode">
+          <span>{{ state.viewForm.frnConsignCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境外收发货人名称(中文):" prop="frnConsignName">
+          <span>{{ state.viewForm.frnConsignName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="监管方式:" prop="tradeMode">
+          <span>{{ state.viewForm.tradeMode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="贸易国别代码:" prop="tradeCountry">
+          <span>{{ state.viewForm.tradeCountry || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货运量毛重:" prop="grossWt">
+          <span>{{ state.viewForm.grossWt || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货运量净重:" prop="netWt">
+          <span>{{ state.viewForm.netWt || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货运值人民币:" prop="rmbPrice">
+          <span>{{ state.viewForm.rmbPrice || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货运值美元:" prop="usdPrice">
+          <span>{{ state.viewForm.usdPrice || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="集装箱数量:" prop="CONTAINER">
+          <span>{{ state.viewForm.CONTAINER || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="报关模式:" prop="declMode">
+          <span>{{ state.viewForm.declMode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="报关单状态:" prop="declStatus">
+          <span>{{ state.viewForm.declStatus || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="现场接单时间:" prop="orderReceiveDate">
+          <span>{{ state.viewForm.orderReceiveDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="接单耗时即单证审核时长(秒):" prop="orderReceiveCost">
+          <span>{{ state.viewForm.orderReceiveCost || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="单证放行时间:" prop="certRlsDate">
+          <span>{{ state.viewForm.certRlsDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="担保放行时间:" prop="preReleaseDate">
+          <span>{{ state.viewForm.preReleaseDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报单位代码:" prop="agentCode">
+          <span>{{ state.viewForm.agentCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报单位名称:" prop="agentName">
+          <span>{{ state.viewForm.agentName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="备注:" prop="noteS">
+          <span>{{ state.viewForm.noteS || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="生产销售单位代码:" prop="ownerCode">
+          <span>{{ state.viewForm.ownerCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产销售单位名称:" prop="ownerName">
+          <span>{{ state.viewForm.ownerName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="转关数据发送时间:" prop="examDate">
+          <span>{{ state.viewForm.examDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="转关数据核销时间:" prop="checkDate">
+          <span>{{ state.viewForm.checkDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="完整申报电子申报时间:" prop="compEleDate">
+          <span>{{ state.viewForm.compEleDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="结关时间:" prop="releaseDate">
+          <span>{{ state.viewForm.releaseDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="海关通关时间(秒):" prop="cuCost">
+          <span>{{ state.viewForm.cuCost || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="总体通关时间(秒):" prop="totalCost">
+          <span>{{ state.viewForm.totalCost || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报前准备时间(秒):" prop="beforeDeclCost">
+          <span>{{ state.viewForm.beforeDeclCost || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否专业审单:" prop="profVerifyFlag">
+          <span>{{ state.viewForm.profVerifyFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否新两步申报标记:" prop="newTwoStepFlag">
+          <span>{{ state.viewForm.newTwoStepFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="电子申报时间:" prop="eleDeclDate">
+          <span>{{ state.viewForm.eleDeclDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="现场验估时间:" prop="assessStartDate">
+          <span>{{ state.viewForm.assessStartDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="验估处置完毕时间:" prop="assessEndDate">
+          <span>{{ state.viewForm.assessEndDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="退单时间:" prop="refundDate">
+          <span>{{ state.viewForm.refundDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否退过单标记:" prop="refundFlag">
+          <span>{{ state.viewForm.refundFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="查验指令下达时间:" prop="manCreateTime">
+          <span>{{ state.viewForm.manCreateTime || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="查验开始时间:" prop="manChkTimeStart">
+          <span>{{ state.viewForm.manChkTimeStart || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="查验结束时间:" prop="manChkTimeEnd">
+          <span>{{ state.viewForm.manChkTimeEnd || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="查验关区:" prop="checkCustomsCode">
+          <span>{{ state.viewForm.checkCustomsCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="是否查验:" prop="checkFlag">
+          <span>{{ state.viewForm.checkFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="处理结果:" prop="manProcResult">
+          <span>{{ state.viewForm.manProcResult || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="处理意见:" prop="manProcIdea">
+          <span>{{ state.viewForm.manProcIdea || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    </el-form>
+  </cacp-dialog>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, reactive, ref } from 'vue'
+import type { FormInstance } from 'element-plus'
+import { ElMessage, ElMessageBox, type FormRules } from 'element-plus'
+import config from '@/config'
+import {
+  SuccessResultCode,
+  useComplexTable,
+  type Result,
+  type SearchPanelLayoutInstance,
+  type TableAction,
+  useLoading
+} from '@cacp/ui'
+import type { EntryHead, EntryHeadQuery } from '@/types/analyze/EntryHead'
+import { insert, getList, getDetail, remove, update } from '@/apis/analyze/EntryHead'
+import { permissionStatus } from '@/utils/globalPermission'
+
+// 表单引用
+const queryFormRef = ref<SearchPanelLayoutInstance>()
+const dialogFormRef = ref<FormInstance>()
+
+// 加载状态
+const { loading, setLoading } = useLoading()
+
+// 表格 Hook
+const tableHooks = useComplexTable<EntryHead>(config)
+const { tableData, tablePagination, setPagination, setPageIndex, setPageSizes } = tableHooks
+
+// 响应式数据
+interface State {
+  queryData: EntryHeadQuery
+  formData: EntryHead
+  viewForm: EntryHead
+  viewTitle: string
+  viewDialogVisible: boolean
+  title: string
+  isEdit: boolean
+  dialogVisible: boolean
+}
+
+const state = reactive<State>({
+  queryData: {
+    mainStatus: '',
+    passMode: '',
+    trafMode: '',
+    iEFlag: '',
+    iEPort: '',
+    declPort: '',
+    iEDate: '',
+    declDate: '',
+    declAdvanceFlag: '',
+    acceptDate: '',
+    exInPortDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    frnConsignCode: '',
+    frnConsignName: '',
+    tradeMode: '',
+    tradeCountry: '',
+    grossWt: '',
+    netWt: '',
+    rmbPrice: '',
+    usdPrice: '',
+    CONTAINER: '',
+    declMode: '',
+    declStatus: '',
+    orderReceiveDate: '',
+    orderReceiveCost: '',
+    certRlsDate: '',
+    preReleaseDate: '',
+    agentCode: '',
+    agentName: '',
+    noteS: '',
+    ownerCode: '',
+    ownerName: '',
+    examDate: '',
+    checkDate: '',
+    compEleDate: '',
+    releaseDate: '',
+    cuCost: '',
+    totalCost: '',
+    beforeDeclCost: '',
+    profVerifyFlag: '',
+    newTwoStepFlag: '',
+    eleDeclDate: '',
+    assessStartDate: '',
+    assessEndDate: '',
+    refundDate: '',
+    refundFlag: '',
+    manCreateTime: '',
+    manChkTimeStart: '',
+    manChkTimeEnd: '',
+    checkCustomsCode: '',
+    checkFlag: '',
+    manProcResult: '',
+    manProcIdea: '',
+    pageIndex: tablePagination.currentPage,
+    pageSize: tablePagination.pageSize
+  },
+  formData: {
+    entryId: '',
+    mainStatus: '',
+    passMode: '',
+    trafMode: '',
+    iEFlag: '',
+    iEPort: '',
+    declPort: '',
+    iEDate: '',
+    declDate: '',
+    declAdvanceFlag: '',
+    acceptDate: '',
+    exInPortDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    frnConsignCode: '',
+    frnConsignName: '',
+    tradeMode: '',
+    tradeCountry: '',
+    grossWt: '',
+    netWt: '',
+    rmbPrice: '',
+    usdPrice: '',
+    CONTAINER: '',
+    declMode: '',
+    declStatus: '',
+    orderReceiveDate: '',
+    orderReceiveCost: '',
+    certRlsDate: '',
+    preReleaseDate: '',
+    agentCode: '',
+    agentName: '',
+    noteS: '',
+    ownerCode: '',
+    ownerName: '',
+    examDate: '',
+    checkDate: '',
+    compEleDate: '',
+    releaseDate: '',
+    cuCost: '',
+    totalCost: '',
+    beforeDeclCost: '',
+    profVerifyFlag: '',
+    newTwoStepFlag: '',
+    eleDeclDate: '',
+    assessStartDate: '',
+    assessEndDate: '',
+    refundDate: '',
+    refundFlag: '',
+    manCreateTime: '',
+    manChkTimeStart: '',
+    manChkTimeEnd: '',
+    checkCustomsCode: '',
+    checkFlag: '',
+    manProcResult: '',
+    manProcIdea: '',
+  } as EntryHead,
+  viewForm: {} as EntryHead,
+  viewTitle: '',
+  viewDialogVisible: false,
+  title: '',
+  isEdit: false,
+  dialogVisible: false,
+})
+
+// 表单验证规则
+const infoRules = reactive<FormRules<EntryHead>>({
+  entryId: [
+    { required: true, message: '报关单号不能为空', trigger: 'blur' }
+  ],
+})
+
+// 表格操作按钮配置
+const actions = <Array<TableAction>>[
+  {
+    key: 'create',
+    text: '新增',
+    onclick: onCreate,
+    limit: permissionStatus('none', 'ANALYZE_ENTRYHEAD_ADD_BT'),
+    position: 'left',
+    type: 'primary',
+  },
+  {
+    key: 'view',
+    text: '查看',
+    onclick: onView,
+    limit: permissionStatus('one', 'ANALYZE_ENTRYHEAD_VIEW_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'edit',
+    text: '修改',
+    onclick: onEdit,
+    limit: permissionStatus('one', 'ANALYZE_ENTRYHEAD_EDIT_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'delete',
+    text: '删除',
+    onclick: onDelete,
+    confirm: true,
+    limit: permissionStatus('none', 'ANALYZE_ENTRYHEAD_DELETE_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'refresh',
+    type: 'primary',
+    text: '刷新',
+    onclick: onRefresh,
+    limit: 'none',
+    position: 'left',
+    plain: true
+  }
+]
+
+// 选中项的 ID 数组
+const ids = ref<string[]>([])
+
+// 多选框选中数据
+function handleSelectionChange(selection: EntryHead[]) {
+  ids.value = selection
+    .map(item => item.entryId)
+    .filter((id): id is string => id != null && id !== undefined)
+}
+
+// 搜索方法
+const onSearch = () => {
+  setPageIndex(1)
+  onLoadData()
+}
+
+// 重置方法
+const onReset = () => {
+  queryFormRef.value?.resetFields()
+  onPageChange(1)
+}
+
+// 每页显示条数变化
+const onSizeChange = (size: number) => {
+  setPageSizes(size)
+  onLoadData()
+}
+
+// 翻页查询
+const onPageChange = (currentPage: number) => {
+  setPageIndex(currentPage)
+  onLoadData()
+}
+
+// 弹框关闭方法
+function onDialogClosed() {
+  state.dialogVisible = false
+  resetForm()
+}
+
+// 重置表单
+function resetForm() {
+  state.formData = {
+    entryId: '',
+    mainStatus: '',
+    passMode: '',
+    trafMode: '',
+    iEFlag: '',
+    iEPort: '',
+    declPort: '',
+    iEDate: '',
+    declDate: '',
+    declAdvanceFlag: '',
+    acceptDate: '',
+    exInPortDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    frnConsignCode: '',
+    frnConsignName: '',
+    tradeMode: '',
+    tradeCountry: '',
+    grossWt: '',
+    netWt: '',
+    rmbPrice: '',
+    usdPrice: '',
+    CONTAINER: '',
+    declMode: '',
+    declStatus: '',
+    orderReceiveDate: '',
+    orderReceiveCost: '',
+    certRlsDate: '',
+    preReleaseDate: '',
+    agentCode: '',
+    agentName: '',
+    noteS: '',
+    ownerCode: '',
+    ownerName: '',
+    examDate: '',
+    checkDate: '',
+    compEleDate: '',
+    releaseDate: '',
+    cuCost: '',
+    totalCost: '',
+    beforeDeclCost: '',
+    profVerifyFlag: '',
+    newTwoStepFlag: '',
+    eleDeclDate: '',
+    assessStartDate: '',
+    assessEndDate: '',
+    refundDate: '',
+    refundFlag: '',
+    manCreateTime: '',
+    manChkTimeStart: '',
+    manChkTimeEnd: '',
+    checkCustomsCode: '',
+    checkFlag: '',
+    manProcResult: '',
+    manProcIdea: '',
+  } as EntryHead
+  dialogFormRef.value?.resetFields()
+}
+
+// 刷新方法
+function onRefresh() {
+  onReset()
+}
+
+// 新增
+function onCreate() {
+  resetForm()
+  state.dialogVisible = true
+  state.isEdit = true
+  state.title = '新增危险品报关单头'
+}
+
+// 查看
+function onView(row: EntryHead) {
+  state.viewForm = { ...row }
+  state.viewDialogVisible = true
+  state.viewTitle = '查看危险品报关单头详情'
+}
+
+// 编辑
+async function onEdit(row: EntryHead) {
+  const res = await getDetail(row.entryId)
+  if (res.code === SuccessResultCode) {
+    state.formData = res.data
+    state.dialogVisible = true
+    state.isEdit = true
+    state.title = '修改危险品报关单头'
+  } else {
+    ElMessage.error(res.message || '数据获取异常')
+  }
+}
+
+// 删除
+async function onDelete(row: EntryHead) {
+  const deleteIds = row.entryId || ids.value
+  if (!deleteIds || deleteIds.length === 0) {
+    ElMessage.warning('请选择要删除的数据')
+    return
+  }
+
+  try {
+    await ElMessageBox.confirm('确定要删除选中的危险品报关单头吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+
+    const res = await remove(deleteIds)
+    if (res.code === SuccessResultCode) {
+      ElMessage.success('删除成功')
+      onPageChange(1)
+    } else {
+      ElMessage.error(res.message || '删除失败')
+    }
+  } catch{
+    // 用户取消删除
+  }
+}
+
+
+// 新增/修改提交
+async function onSubmit() {
+  if (!dialogFormRef.value) return
+
+  const isValid = await dialogFormRef.value.validate()
+  if (!isValid) return
+
+  try {
+
+
+    let res: Result<any>
+    if (state.formData.entryId) {
+      res = await update(state.formData)
+    } else {
+      res = await insert(state.formData)
+    }
+
+    if (res.code === SuccessResultCode) {
+      ElMessage.success(state.formData.entryId ? '修改成功' : '新增成功')
+      state.dialogVisible = false
+      onPageChange(1)
+    } else {
+      ElMessage.error(res.message || '操作失败')
+    }
+  } catch (error) {
+    console.error('提交失败:', error)
+    ElMessage.error('操作失败')
+  }
+}
+
+// 数据查询
+async function onLoadData() {
+  setLoading(true)
+  try {
+    const query = {
+      ...state.queryData,
+      pageIndex: tablePagination.currentPage,
+      pageSize: tablePagination.pageSize
+    }
+    const res = await getList(query)
+    if (res.code === SuccessResultCode) {
+      setPagination(res.data)
+    } else {
+      ElMessage.error(res.message || '查询失败')
+    }
+  } catch (error) {
+    console.error('查询失败:', error)
+    ElMessage.error('查询失败')
+  } finally {
+    setLoading(false)
+  }
+}
+
+
+// 组件挂载时加载数据
+onMounted(() => {
+  onLoadData()
+})
+</script>
+
+<style scoped>
+/* 自定义样式 */
+</style>

+ 1238 - 0
wxjy-wxjy-web/src/views/analyze/NewDeclaredGoods.vue

@@ -0,0 +1,1238 @@
+<template>
+  <cacp-search-layout>
+    <template #search>
+      <cacp-search-panel-layout
+        :model="state.queryData"
+        ref="queryFormRef"
+        label-position="left"
+        label-width="auto"
+        :gutter="30"
+        :colSpan="6"
+      >
+        <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="120"
+      @selection-change="handleSelectionChange"
+      @on-page-change="onPageChange"
+      @on-size-change="onSizeChange"
+      :loading="loading"
+    >
+      <el-table-column type="selection" width="36" fixed="left" />
+      <el-table-column property="ID" label="主键" width="100" :show-overflow-tooltip="true" />
+      <el-table-column property="entryId" label="报关单号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gNo" label="商品序号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ieFlag" label="出入境标志" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iePort" label="进出境口岸" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declPort" label="申报口岸" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="customsCode" label="所属海关" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declDate" label="申报时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignScc" label="境内收发货人代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignCode" label="境内收发货人代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="consignName" label="境内收发货人名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="codeTs" label="商品编号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iqCode" label="检验检疫编码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gName" label="商品名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iqGName" label="报检名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gNameFn" label="商品英文名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gModel" label="规格型号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iqGModel" label="检验检疫货物规格" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gComposition" label="成份/原料/组分" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="prodWarranty" label="产品保质期" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="prodValidaty" label="产品有效期" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="dutyMode" label="征免方式" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="GTIN" label="条形码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gQty" label="申报数量" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gUnit" label="申报计量单位" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="qty1" label="法定第一数量" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="unit1" label="法定第一计量单位" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="qty2" label="第二数量" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="unit2" label="第二计量单位" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declPrice" label="申报单价" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="declTotal" label="申报总价" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="tradeCurr" label="成交币制" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="tradeTotal" label="成交总价" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="dutyValue" label="完税价格" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="rmbPrice" label="统计人民币价" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="usdPrice" label="统计美元价" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="exchangeRate" label="成交汇率" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="originCountry" label="原产国" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="originRegionCode" label="原产地区代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="destCountry" label="最终目的国" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ieDistrictCode" label="境内目的地/境内货源地" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="iqIeDistrictCode" label="目的地/货源地" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="frnProducerName" label="境外生产企业名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="productModel" label="货物型号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="productBrand" label="货物品牌" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="productDate" label="生产日期" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="productBatch" label="生产批次" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="UNGID" label="UN编码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ungFlag" label="非危险化学品" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ungModel" label="危包规格" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ungClassify" label="危包类别" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="ungGName" label="危险货物名称" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="productCharCode" label="货物属性代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="goodsId" label="货号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="useTo" label="用途代码" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="gCertFlag" label="每项商品需要监管证件" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="mnufctrRegNo" label="生产单位注册号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="createTime" label="创建时间" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="CAS" label="危化品目录的CAS号" width="120" :show-overflow-tooltip="true" />
+      <el-table-column property="goodsType" label="危险品类型" width="120" :show-overflow-tooltip="true" />
+    </cacp-complex-table>
+  </cacp-search-layout>
+
+  <cacp-dialog
+    v-model="state.dialogVisible"
+    :resizable="false"
+    :title="state.title"
+    width="60%"
+    @closed="onDialogClosed"
+  >
+    <el-form
+      :model="state.formData"
+      ref="dialogFormRef"
+      :rules="infoRules"
+      label-width="auto"
+      label-position="left"
+      :disabled="!state.isEdit"
+    >
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="报关单号" prop="entryId">
+            <el-input v-model="state.formData.entryId" placeholder="请输入报关单号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="商品序号" prop="gNo">
+            <el-input v-model="state.formData.gNo" placeholder="请输入商品序号" />
+          </el-form-item>
+        </el-col>
+      </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="出入境标志" prop="ieFlag">
+          <el-input v-model="state.formData.ieFlag" placeholder="请输入出入境标志" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="进出境口岸" prop="iePort">
+          <el-input v-model="state.formData.iePort" placeholder="请输入进出境口岸" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报口岸" prop="declPort">
+          <el-input v-model="state.formData.declPort" placeholder="请输入申报口岸" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="所属海关" prop="customsCode">
+          <el-input v-model="state.formData.customsCode" placeholder="请输入所属海关" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报时间" prop="declDate">
+          <el-input v-model="state.formData.declDate" placeholder="请输入申报时间" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码" prop="consignScc">
+          <el-input v-model="state.formData.consignScc" placeholder="请输入境内收发货人代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码" prop="consignCode">
+          <el-input v-model="state.formData.consignCode" placeholder="请输入境内收发货人代码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人名称" prop="consignName">
+          <el-input v-model="state.formData.consignName" placeholder="请输入境内收发货人名称" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品编号" prop="codeTs">
+          <el-input v-model="state.formData.codeTs" placeholder="请输入商品编号" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="检验检疫编码" prop="iqCode">
+          <el-input v-model="state.formData.iqCode" placeholder="请输入检验检疫编码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品名称" prop="gName">
+          <el-input v-model="state.formData.gName" placeholder="请输入商品名称" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="报检名称" prop="iqGName">
+          <el-input v-model="state.formData.iqGName" placeholder="请输入报检名称" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品英文名称" prop="gNameFn">
+          <el-input v-model="state.formData.gNameFn" placeholder="请输入商品英文名称" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="规格型号" prop="gModel">
+          <el-input v-model="state.formData.gModel" placeholder="请输入规格型号" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="检验检疫货物规格" prop="iqGModel">
+          <el-input v-model="state.formData.iqGModel" placeholder="请输入检验检疫货物规格" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成份/原料/组分" prop="gComposition">
+          <el-input v-model="state.formData.gComposition" placeholder="请输入成份/原料/组分" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="产品保质期" prop="prodWarranty">
+          <el-input v-model="state.formData.prodWarranty" placeholder="请输入产品保质期" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="产品有效期" prop="prodValidaty">
+          <el-input v-model="state.formData.prodValidaty" placeholder="请输入产品有效期" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="征免方式" prop="dutyMode">
+          <el-input v-model="state.formData.dutyMode" placeholder="请输入征免方式" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="条形码" prop="GTIN">
+          <el-input v-model="state.formData.GTIN" placeholder="请输入条形码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报数量" prop="gQty">
+          <el-input v-model="state.formData.gQty" placeholder="请输入申报数量" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报计量单位" prop="gUnit">
+          <el-input v-model="state.formData.gUnit" placeholder="请输入申报计量单位" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="法定第一数量" prop="qty1">
+          <el-input v-model="state.formData.qty1" placeholder="请输入法定第一数量" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="法定第一计量单位" prop="unit1">
+          <el-input v-model="state.formData.unit1" placeholder="请输入法定第一计量单位" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="第二数量" prop="qty2">
+          <el-input v-model="state.formData.qty2" placeholder="请输入第二数量" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="第二计量单位" prop="unit2">
+          <el-input v-model="state.formData.unit2" placeholder="请输入第二计量单位" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报单价" prop="declPrice">
+          <el-input v-model="state.formData.declPrice" placeholder="请输入申报单价" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报总价" prop="declTotal">
+          <el-input v-model="state.formData.declTotal" placeholder="请输入申报总价" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="成交币制" prop="tradeCurr">
+          <el-input v-model="state.formData.tradeCurr" placeholder="请输入成交币制" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成交总价" prop="tradeTotal">
+          <el-input v-model="state.formData.tradeTotal" placeholder="请输入成交总价" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="完税价格" prop="dutyValue">
+          <el-input v-model="state.formData.dutyValue" placeholder="请输入完税价格" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="统计人民币价" prop="rmbPrice">
+          <el-input v-model="state.formData.rmbPrice" placeholder="请输入统计人民币价" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="统计美元价" prop="usdPrice">
+          <el-input v-model="state.formData.usdPrice" placeholder="请输入统计美元价" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成交汇率" prop="exchangeRate">
+          <el-input v-model="state.formData.exchangeRate" placeholder="请输入成交汇率" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="原产国" prop="originCountry">
+          <el-input v-model="state.formData.originCountry" placeholder="请输入原产国" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="原产地区代码" prop="originRegionCode">
+          <el-input v-model="state.formData.originRegionCode" placeholder="请输入原产地区代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="最终目的国" prop="destCountry">
+          <el-input v-model="state.formData.destCountry" placeholder="请输入最终目的国" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内目的地/境内货源地" prop="ieDistrictCode">
+          <el-input v-model="state.formData.ieDistrictCode" placeholder="请输入境内目的地/境内货源地" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="目的地/货源地" prop="iqIeDistrictCode">
+          <el-input v-model="state.formData.iqIeDistrictCode" placeholder="请输入目的地/货源地" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境外生产企业名称" prop="frnProducerName">
+          <el-input v-model="state.formData.frnProducerName" placeholder="请输入境外生产企业名称" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货物型号" prop="productModel">
+          <el-input v-model="state.formData.productModel" placeholder="请输入货物型号" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货物品牌" prop="productBrand">
+          <el-input v-model="state.formData.productBrand" placeholder="请输入货物品牌" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="生产日期" prop="productDate">
+          <el-input v-model="state.formData.productDate" placeholder="请输入生产日期" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产批次" prop="productBatch">
+          <el-input v-model="state.formData.productBatch" placeholder="请输入生产批次" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="UN编码" prop="UNGID">
+          <el-input v-model="state.formData.UNGID" placeholder="请输入UN编码" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="非危险化学品" prop="ungFlag">
+          <el-input v-model="state.formData.ungFlag" placeholder="请输入非危险化学品" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危包规格" prop="ungModel">
+          <el-input v-model="state.formData.ungModel" placeholder="请输入危包规格" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="危包类别" prop="ungClassify">
+          <el-input v-model="state.formData.ungClassify" placeholder="请输入危包类别" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危险货物名称" prop="ungGName">
+          <el-input v-model="state.formData.ungGName" placeholder="请输入危险货物名称" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货物属性代码" prop="productCharCode">
+          <el-input v-model="state.formData.productCharCode" placeholder="请输入货物属性代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货号" prop="goodsId">
+          <el-input v-model="state.formData.goodsId" placeholder="请输入货号" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="用途代码" prop="useTo">
+          <el-input v-model="state.formData.useTo" placeholder="请输入用途代码" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="每项商品需要监管证件" prop="gCertFlag">
+          <el-input v-model="state.formData.gCertFlag" placeholder="请输入每项商品需要监管证件" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产单位注册号" prop="mnufctrRegNo">
+          <el-input v-model="state.formData.mnufctrRegNo" placeholder="请输入生产单位注册号" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="创建时间" prop="createTime">-->
+<!--          <el-input v-model="state.formData.createTime" placeholder="请输入创建时间" />-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+      <el-col :span="12">
+        <el-form-item label="危化品目录的CAS号" prop="CAS">
+          <el-input v-model="state.formData.CAS" placeholder="请输入危化品目录的CAS号" />
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危险品类型" prop="goodsType">
+          <el-input v-model="state.formData.goodsType" placeholder="请输入危险品类型" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    </el-form>
+    <template #footer v-if="state.isEdit">
+      <el-button @click="onDialogClosed">取消</el-button>
+      <el-button type="primary" @click="onSubmit">确定</el-button>
+    </template>
+  </cacp-dialog>
+
+  <cacp-dialog
+    v-model="state.viewDialogVisible"
+    :resizable="false"
+    :title="state.viewTitle"
+    width="50%"
+  >
+    <el-form
+      :model="state.viewForm"
+      label-width="auto"
+      label-position="left"
+      :disabled="true"
+    >
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="报关单号:" prop="entryId">
+            <span>{{ state.viewForm.entryId || '-' }}</span>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="商品序号:" prop="gNo">
+            <span>{{ state.viewForm.gNo || '-' }}</span>
+          </el-form-item>
+        </el-col>
+      </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="出入境标志:" prop="ieFlag">
+          <span>{{ state.viewForm.ieFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="进出境口岸:" prop="iePort">
+          <span>{{ state.viewForm.iePort || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报口岸:" prop="declPort">
+          <span>{{ state.viewForm.declPort || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="所属海关:" prop="customsCode">
+          <span>{{ state.viewForm.customsCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报时间:" prop="declDate">
+          <span>{{ state.viewForm.declDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码:" prop="consignScc">
+          <span>{{ state.viewForm.consignScc || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="境内收发货人代码:" prop="consignCode">
+          <span>{{ state.viewForm.consignCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内收发货人名称:" prop="consignName">
+          <span>{{ state.viewForm.consignName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品编号:" prop="codeTs">
+          <span>{{ state.viewForm.codeTs || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="检验检疫编码:" prop="iqCode">
+          <span>{{ state.viewForm.iqCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品名称:" prop="gName">
+          <span>{{ state.viewForm.gName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="报检名称:" prop="iqGName">
+          <span>{{ state.viewForm.iqGName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="商品英文名称:" prop="gNameFn">
+          <span>{{ state.viewForm.gNameFn || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="规格型号:" prop="gModel">
+          <span>{{ state.viewForm.gModel || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="检验检疫货物规格:" prop="iqGModel">
+          <span>{{ state.viewForm.iqGModel || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成份/原料/组分:" prop="gComposition">
+          <span>{{ state.viewForm.gComposition || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="产品保质期:" prop="prodWarranty">
+          <span>{{ state.viewForm.prodWarranty || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="产品有效期:" prop="prodValidaty">
+          <span>{{ state.viewForm.prodValidaty || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="征免方式:" prop="dutyMode">
+          <span>{{ state.viewForm.dutyMode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="条形码:" prop="GTIN">
+          <span>{{ state.viewForm.GTIN || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报数量:" prop="gQty">
+          <span>{{ state.viewForm.gQty || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报计量单位:" prop="gUnit">
+          <span>{{ state.viewForm.gUnit || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="法定第一数量:" prop="qty1">
+          <span>{{ state.viewForm.qty1 || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="法定第一计量单位:" prop="unit1">
+          <span>{{ state.viewForm.unit1 || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="第二数量:" prop="qty2">
+          <span>{{ state.viewForm.qty2 || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="第二计量单位:" prop="unit2">
+          <span>{{ state.viewForm.unit2 || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="申报单价:" prop="declPrice">
+          <span>{{ state.viewForm.declPrice || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="申报总价:" prop="declTotal">
+          <span>{{ state.viewForm.declTotal || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="成交币制:" prop="tradeCurr">
+          <span>{{ state.viewForm.tradeCurr || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成交总价:" prop="tradeTotal">
+          <span>{{ state.viewForm.tradeTotal || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="完税价格:" prop="dutyValue">
+          <span>{{ state.viewForm.dutyValue || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="统计人民币价:" prop="rmbPrice">
+          <span>{{ state.viewForm.rmbPrice || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="统计美元价:" prop="usdPrice">
+          <span>{{ state.viewForm.usdPrice || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="成交汇率:" prop="exchangeRate">
+          <span>{{ state.viewForm.exchangeRate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="原产国:" prop="originCountry">
+          <span>{{ state.viewForm.originCountry || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="原产地区代码:" prop="originRegionCode">
+          <span>{{ state.viewForm.originRegionCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="最终目的国:" prop="destCountry">
+          <span>{{ state.viewForm.destCountry || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境内目的地/境内货源地:" prop="ieDistrictCode">
+          <span>{{ state.viewForm.ieDistrictCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="目的地/货源地:" prop="iqIeDistrictCode">
+          <span>{{ state.viewForm.iqIeDistrictCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="境外生产企业名称:" prop="frnProducerName">
+          <span>{{ state.viewForm.frnProducerName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货物型号:" prop="productModel">
+          <span>{{ state.viewForm.productModel || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货物品牌:" prop="productBrand">
+          <span>{{ state.viewForm.productBrand || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="生产日期:" prop="productDate">
+          <span>{{ state.viewForm.productDate || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产批次:" prop="productBatch">
+          <span>{{ state.viewForm.productBatch || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="UN编码:" prop="UNGID">
+          <span>{{ state.viewForm.UNGID || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="非危险化学品:" prop="ungFlag">
+          <span>{{ state.viewForm.ungFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危包规格:" prop="ungModel">
+          <span>{{ state.viewForm.ungModel || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="危包类别:" prop="ungClassify">
+          <span>{{ state.viewForm.ungClassify || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危险货物名称:" prop="ungGName">
+          <span>{{ state.viewForm.ungGName || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="货物属性代码:" prop="productCharCode">
+          <span>{{ state.viewForm.productCharCode || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="货号:" prop="goodsId">
+          <span>{{ state.viewForm.goodsId || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="用途代码:" prop="useTo">
+          <span>{{ state.viewForm.useTo || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="每项商品需要监管证件:" prop="gCertFlag">
+          <span>{{ state.viewForm.gCertFlag || '-' }}</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="生产单位注册号:" prop="mnufctrRegNo">
+          <span>{{ state.viewForm.mnufctrRegNo || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="创建时间:" prop="createTime">-->
+<!--          <span>{{ state.viewForm.createTime || '-' }}</span>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+      <el-col :span="12">
+        <el-form-item label="危化品目录的CAS号:" prop="CAS">
+          <span>{{ state.viewForm.CAS || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row><el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="危险品类型:" prop="goodsType">
+          <span>{{ state.viewForm.goodsType || '-' }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    </el-form>
+  </cacp-dialog>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, reactive, ref } from 'vue'
+import type { FormInstance } from 'element-plus'
+import { ElMessage, ElMessageBox, type FormRules } from 'element-plus'
+import config from '@/config'
+import {
+  SuccessResultCode,
+  useComplexTable,
+  type Result,
+  type SearchPanelLayoutInstance,
+  type TableAction,
+  useLoading
+} from '@cacp/ui'
+import type { NewDeclaredGoods, NewDeclaredGoodsQuery } from '@/types/analyze/NewDeclaredGoods'
+import { insert, getList, getDetail, remove, update } from '@/apis/analyze/NewDeclaredGoods'
+import { permissionStatus } from '@/utils/globalPermission'
+
+// 表单引用
+const queryFormRef = ref<SearchPanelLayoutInstance>()
+const dialogFormRef = ref<FormInstance>()
+
+// 加载状态
+const { loading, setLoading } = useLoading()
+
+// 表格 Hook
+const tableHooks = useComplexTable<NewDeclaredGoods>(config)
+const { tableData, tablePagination, setPagination, setPageIndex, setPageSizes } = tableHooks
+
+// 响应式数据
+interface State {
+  queryData: NewDeclaredGoodsQuery
+  formData: NewDeclaredGoods
+  viewForm: NewDeclaredGoods
+  viewTitle: string
+  viewDialogVisible: boolean
+  title: string
+  isEdit: boolean
+  dialogVisible: boolean
+}
+
+const state = reactive<State>({
+  queryData: {
+    entryId: '',
+    gNo: '',
+    ieFlag: '',
+    iePort: '',
+    declPort: '',
+    customsCode: '',
+    declDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    codeTs: '',
+    iqCode: '',
+    gName: '',
+    iqGName: '',
+    gNameFn: '',
+    gModel: '',
+    iqGModel: '',
+    gComposition: '',
+    prodWarranty: '',
+    prodValidaty: '',
+    dutyMode: '',
+    GTIN: '',
+    gQty: '',
+    gUnit: '',
+    qty1: '',
+    unit1: '',
+    qty2: '',
+    unit2: '',
+    declPrice: '',
+    declTotal: '',
+    tradeCurr: '',
+    tradeTotal: '',
+    dutyValue: '',
+    rmbPrice: '',
+    usdPrice: '',
+    exchangeRate: '',
+    originCountry: '',
+    originRegionCode: '',
+    destCountry: '',
+    ieDistrictCode: '',
+    iqIeDistrictCode: '',
+    frnProducerName: '',
+    productModel: '',
+    productBrand: '',
+    productDate: '',
+    productBatch: '',
+    UNGID: '',
+    ungFlag: '',
+    ungModel: '',
+    ungClassify: '',
+    ungGName: '',
+    productCharCode: '',
+    goodsId: '',
+    useTo: '',
+    gCertFlag: '',
+    mnufctrRegNo: '',
+    // createTime: '',
+    CAS: '',
+    goodsType: '',
+    pageIndex: tablePagination.currentPage,
+    pageSize: tablePagination.pageSize
+  },
+  formData: {
+    ID: '',
+    entryId: '',
+    gNo: '',
+    ieFlag: '',
+    iePort: '',
+    declPort: '',
+    customsCode: '',
+    declDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    codeTs: '',
+    iqCode: '',
+    gName: '',
+    iqGName: '',
+    gNameFn: '',
+    gModel: '',
+    iqGModel: '',
+    gComposition: '',
+    prodWarranty: '',
+    prodValidaty: '',
+    dutyMode: '',
+    GTIN: '',
+    gQty: '',
+    gUnit: '',
+    qty1: '',
+    unit1: '',
+    qty2: '',
+    unit2: '',
+    declPrice: '',
+    declTotal: '',
+    tradeCurr: '',
+    tradeTotal: '',
+    dutyValue: '',
+    rmbPrice: '',
+    usdPrice: '',
+    exchangeRate: '',
+    originCountry: '',
+    originRegionCode: '',
+    destCountry: '',
+    ieDistrictCode: '',
+    iqIeDistrictCode: '',
+    frnProducerName: '',
+    productModel: '',
+    productBrand: '',
+    productDate: '',
+    productBatch: '',
+    UNGID: '',
+    ungFlag: '',
+    ungModel: '',
+    ungClassify: '',
+    ungGName: '',
+    productCharCode: '',
+    goodsId: '',
+    useTo: '',
+    gCertFlag: '',
+    mnufctrRegNo: '',
+    createTime: '',
+    CAS: '',
+    goodsType: '',
+  } as NewDeclaredGoods,
+  viewForm: {} as NewDeclaredGoods,
+  viewTitle: '',
+  viewDialogVisible: false,
+  title: '',
+  isEdit: false,
+  dialogVisible: false,
+})
+
+// 表单验证规则
+const infoRules = reactive<FormRules<NewDeclaredGoods>>({
+  ID: [
+    { required: true, message: '主键不能为空', trigger: 'blur' }
+  ],
+})
+
+// 表格操作按钮配置
+const actions = <Array<TableAction>>[
+  {
+    key: 'create',
+    text: '新增',
+    onclick: onCreate,
+    limit: permissionStatus('none', 'ANALYZE_NEWDECLAREDGOODS_ADD_BT'),
+    position: 'left',
+    type: 'primary',
+  },
+  {
+    key: 'view',
+    text: '查看',
+    onclick: onView,
+    limit: permissionStatus('one', 'ANALYZE_NEWDECLAREDGOODS_VIEW_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'edit',
+    text: '修改',
+    onclick: onEdit,
+    limit: permissionStatus('one', 'ANALYZE_NEWDECLAREDGOODS_EDIT_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'delete',
+    text: '删除',
+    onclick: onDelete,
+    confirm: true,
+    limit: permissionStatus('none', 'ANALYZE_NEWDECLAREDGOODS_DELETE_BT'),
+    type: 'primary'
+  },
+  {
+    key: 'refresh',
+    type: 'primary',
+    text: '刷新',
+    onclick: onRefresh,
+    limit: 'none',
+    position: 'left',
+    plain: true
+  }
+]
+
+// 选中项的 ID 数组
+const ids = ref<string[]>([])
+
+// 多选框选中数据
+function handleSelectionChange(selection: NewDeclaredGoods[]) {
+  ids.value = selection
+    .map(item => item.ID)
+    .filter((id): id is string => id != null && id !== undefined)
+}
+
+// 搜索方法
+const onSearch = () => {
+  setPageIndex(1)
+  onLoadData()
+}
+
+// 重置方法
+const onReset = () => {
+  queryFormRef.value?.resetFields()
+  onPageChange(1)
+}
+
+// 每页显示条数变化
+const onSizeChange = (size: number) => {
+  setPageSizes(size)
+  onLoadData()
+}
+
+// 翻页查询
+const onPageChange = (currentPage: number) => {
+  setPageIndex(currentPage)
+  onLoadData()
+}
+
+// 弹框关闭方法
+function onDialogClosed() {
+  state.dialogVisible = false
+  resetForm()
+}
+
+// 重置表单
+function resetForm() {
+  state.formData = {
+    ID: '',
+    entryId: '',
+    gNo: '',
+    ieFlag: '',
+    iePort: '',
+    declPort: '',
+    customsCode: '',
+    declDate: '',
+    consignScc: '',
+    consignCode: '',
+    consignName: '',
+    codeTs: '',
+    iqCode: '',
+    gName: '',
+    iqGName: '',
+    gNameFn: '',
+    gModel: '',
+    iqGModel: '',
+    gComposition: '',
+    prodWarranty: '',
+    prodValidaty: '',
+    dutyMode: '',
+    GTIN: '',
+    gQty: '',
+    gUnit: '',
+    qty1: '',
+    unit1: '',
+    qty2: '',
+    unit2: '',
+    declPrice: '',
+    declTotal: '',
+    tradeCurr: '',
+    tradeTotal: '',
+    dutyValue: '',
+    rmbPrice: '',
+    usdPrice: '',
+    exchangeRate: '',
+    originCountry: '',
+    originRegionCode: '',
+    destCountry: '',
+    ieDistrictCode: '',
+    iqIeDistrictCode: '',
+    frnProducerName: '',
+    productModel: '',
+    productBrand: '',
+    productDate: '',
+    productBatch: '',
+    UNGID: '',
+    ungFlag: '',
+    ungModel: '',
+    ungClassify: '',
+    ungGName: '',
+    productCharCode: '',
+    goodsId: '',
+    useTo: '',
+    gCertFlag: '',
+    mnufctrRegNo: '',
+    createTime: '',
+    CAS: '',
+    goodsType: '',
+  } as NewDeclaredGoods
+  dialogFormRef.value?.resetFields()
+}
+
+// 刷新方法
+function onRefresh() {
+  onReset()
+}
+
+// 新增
+function onCreate() {
+  resetForm()
+  state.dialogVisible = true
+  state.isEdit = true
+  state.title = '新增新申报商品提示'
+}
+
+// 查看
+function onView(row: NewDeclaredGoods) {
+  state.viewForm = { ...row }
+  state.viewDialogVisible = true
+  state.viewTitle = '查看新申报商品提示详情'
+}
+
+// 编辑
+async function onEdit(row: NewDeclaredGoods) {
+  const res = await getDetail(row.ID)
+  if (res.code === SuccessResultCode) {
+    state.formData = res.data
+    state.dialogVisible = true
+    state.isEdit = true
+    state.title = '修改新申报商品提示'
+  } else {
+    ElMessage.error(res.message || '数据获取异常')
+  }
+}
+
+// 删除
+async function onDelete(row: NewDeclaredGoods) {
+  const deleteIds = row.ID || ids.value
+  if (!deleteIds || deleteIds.length === 0) {
+    ElMessage.warning('请选择要删除的数据')
+    return
+  }
+
+  try {
+    await ElMessageBox.confirm('确定要删除选中的新申报商品提示吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    })
+
+    const res = await remove(deleteIds)
+    if (res.code === SuccessResultCode) {
+      ElMessage.success('删除成功')
+      onPageChange(1)
+    } else {
+      ElMessage.error(res.message || '删除失败')
+    }
+  } catch{
+    // 用户取消删除
+  }
+}
+
+
+// 新增/修改提交
+async function onSubmit() {
+  if (!dialogFormRef.value) return
+
+  const isValid = await dialogFormRef.value.validate()
+  if (!isValid) return
+
+  try {
+
+
+    let res: Result<any>
+    if (state.formData.ID) {
+      res = await update(state.formData)
+    } else {
+      res = await insert(state.formData)
+    }
+
+    if (res.code === SuccessResultCode) {
+      ElMessage.success(state.formData.ID ? '修改成功' : '新增成功')
+      state.dialogVisible = false
+      onPageChange(1)
+    } else {
+      ElMessage.error(res.message || '操作失败')
+    }
+  } catch (error) {
+    console.error('提交失败:', error)
+    ElMessage.error('操作失败')
+  }
+}
+
+// 数据查询
+async function onLoadData() {
+  setLoading(true)
+  try {
+    const query = {
+      ...state.queryData,
+      pageIndex: tablePagination.currentPage,
+      pageSize: tablePagination.pageSize
+    }
+    const res = await getList(query)
+    if (res.code === SuccessResultCode) {
+      setPagination(res.data)
+    } else {
+      ElMessage.error(res.message || '查询失败')
+    }
+  } catch (error) {
+    console.error('查询失败:', error)
+    ElMessage.error('查询失败')
+  } finally {
+    setLoading(false)
+  }
+}
+
+
+// 组件挂载时加载数据
+onMounted(() => {
+  onLoadData()
+})
+</script>
+
+<style scoped>
+/* 自定义样式 */
+</style>

+ 74 - 0
wxjy-wxjy-web/src/views/gen/basicInfoForm.vue

@@ -0,0 +1,74 @@
+<template>
+  <el-form ref="basicInfoFormRef" :model="info" :rules="rules" label-width="150px">
+    <el-row>
+      <el-col :span="12">
+        <el-form-item label="表名称" prop="tableName">
+          <el-input placeholder="请输入仓库名称" v-model="info.tableName" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="表描述" prop="tableComment">
+          <el-input placeholder="请输入" v-model="info.tableComment" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="实体类名称" prop="className">
+          <el-input placeholder="请输入" v-model="info.className" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="作者" prop="functionAuthor">
+          <el-input placeholder="请输入" v-model="info.functionAuthor" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" :rows="3" v-model="info.remark"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, defineProps, defineExpose } from 'vue'
+import type { FormInstance, FormRules } from 'element-plus'
+
+// 定义类型
+interface TableInfo {
+  tableName?: string
+  tableComment?: string
+  className?: string
+  functionAuthor?: string
+  remark?: string
+}
+
+// Props
+const props = defineProps<{
+  info: TableInfo
+}>()
+
+// Refs
+const basicInfoFormRef = ref<FormInstance>()
+
+// 表单验证规则
+const rules = reactive<FormRules>({
+  tableName: [
+    { required: true, message: "请输入表名称", trigger: "blur" }
+  ],
+  tableComment: [
+    { required: true, message: "请输入表描述", trigger: "blur" }
+  ],
+  className: [
+    { required: true, message: "请输入实体类名称", trigger: "blur" }
+  ],
+  functionAuthor: [
+    { required: true, message: "请输入作者", trigger: "blur" }
+  ]
+})
+
+// 暴露方法给父组件
+defineExpose({
+  getFormRef: () => basicInfoFormRef.value
+})
+</script>

+ 70 - 0
wxjy-wxjy-web/src/views/gen/createTable.vue

@@ -0,0 +1,70 @@
+<template>
+  <!-- 创建表 -->
+  <el-dialog
+    title="创建表"
+    v-model="visible"
+    width="800px"
+    top="5vh"
+    append-to-body
+  >
+    <span>创建表语句(支持多个建表语句):</span>
+    <el-input
+      type="textarea"
+      :rows="10"
+      placeholder="请输入文本"
+      v-model="content"
+    />
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="handleCreateTable">确 定</el-button>
+        <el-button @click="visible = false">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { createTable } from "@/apis/gen/gen"
+
+// 定义props和emits
+interface Emits {
+  (e: 'ok'): void
+}
+
+const emit = defineEmits<Emits>()
+
+// 响应式数据
+const visible = ref(false)
+const content = ref('')
+
+// 方法
+const show = () => {
+  visible.value = true
+}
+
+/** 创建按钮操作 */
+const handleCreateTable = async () => {
+  if (content.value === "") {
+    ElMessage.error("请输入建表语句")
+    return
+  }
+
+  try {
+    const res = await createTable({ sql: content.value })
+    ElMessage.success(res.msg)
+    if (res.code === 200) {
+      visible.value = false
+      emit('ok')
+    }
+  } catch (error) {
+    console.error('创建表失败:', error)
+  }
+}
+
+// 暴露方法给父组件
+defineExpose({
+  show
+})
+</script>

+ 403 - 0
wxjy-wxjy-web/src/views/gen/editTable.vue

@@ -0,0 +1,403 @@
+<template>
+  <el-card>
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="基本信息" name="basic">
+        <basic-info-form ref="basicInfoRef" :info="info" />
+      </el-tab-pane>
+      <el-tab-pane label="字段信息" name="columnInfo">
+        <el-table
+          ref="dragTableRef"
+          :data="columns"
+          row-key="columnId"
+          :max-height="tableHeight"
+        >
+          <el-table-column
+            label="序号"
+            type="index"
+            min-width="5%"
+            class-name="allowDrag"
+          />
+          <el-table-column
+            label="字段列名"
+            prop="columnName"
+            min-width="10%"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column label="字段描述" min-width="10%">
+            <template #default="scope">
+              <el-input v-model="scope.row.columnComment"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="物理类型"
+            prop="columnType"
+            min-width="10%"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column label="Java类型" min-width="11%">
+            <template #default="scope">
+              <el-select v-model="scope.row.javaType">
+                <el-option label="Long" value="Long" />
+                <el-option label="String" value="String" />
+                <el-option label="Integer" value="Integer" />
+                <el-option label="Double" value="Double" />
+                <el-option label="BigDecimal" value="BigDecimal" />
+                <el-option label="Date" value="Date" />
+                <el-option label="Boolean" value="Boolean" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="java属性" min-width="10%">
+            <template #default="scope">
+              <el-input v-model="scope.row.javaField"></el-input>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="插入" min-width="5%">
+            <template #default="scope">
+              <el-checkbox
+                true-label="1"
+                false-label="0"
+                v-model="scope.row.isInsert"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="编辑" min-width="5%">
+            <template #default="scope">
+              <el-checkbox
+                true-label="1"
+                false-label="0"
+                v-model="scope.row.isEdit"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="列表" min-width="5%">
+            <template #default="scope">
+              <el-checkbox
+                true-label="1"
+                false-label="0"
+                v-model="scope.row.isList"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="查询" min-width="5%">
+            <template #default="scope">
+              <el-checkbox
+                true-label="1"
+                false-label="0"
+                v-model="scope.row.isQuery"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="查询方式" min-width="10%">
+            <template #default="scope">
+              <el-select v-model="scope.row.queryType">
+                <el-option label="=" value="EQ" />
+                <el-option label="!=" value="NE" />
+                <el-option label=">" value="GT" />
+                <el-option label=">=" value="GTE" />
+                <el-option label="<" value="LT" />
+                <el-option label="<=" value="LTE" />
+                <el-option label="LIKE" value="LIKE" />
+                <el-option label="BETWEEN" value="BETWEEN" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="必填" min-width="5%">
+            <template #default="scope">
+              <el-checkbox
+                true-label="1"
+                false-label="0"
+                v-model="scope.row.isRequired"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="显示类型" min-width="12%">
+            <template #default="scope">
+              <el-select v-model="scope.row.htmlType">
+                <el-option label="文本框" value="input" />
+                <el-option label="文本域" value="textarea" />
+                <el-option label="下拉框" value="select" />
+                <el-option label="单选框" value="radio" />
+                <el-option label="复选框" value="checkbox" />
+                <el-option label="日期控件" value="datetime" />
+                <el-option label="图片上传" value="imageUpload" />
+                <el-option label="文件上传" value="fileUpload" />
+                <el-option label="富文本控件" value="editor" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="字典类型" min-width="12%">
+            <template #default="scope">
+              <el-select
+                v-model="scope.row.dictType"
+                clearable
+                filterable
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="dict in dictOptions"
+                  :key="dict.dictType"
+                  :label="dict.dictName"
+                  :value="dict.dictType"
+                >
+                  <span style="float: left">{{ dict.dictName }}</span>
+                  <span style="float: right; color: #8492a6; font-size: 13px">
+                    {{ dict.dictType }}
+                  </span>
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="生成信息" name="genInfo">
+        <gen-info-form
+          ref="genInfoRef"
+          :info="info"
+          :tables="tables"
+          :menus="menus"
+        />
+      </el-tab-pane>
+    </el-tabs>
+    <el-form label-width="100px">
+      <el-form-item
+        style="text-align: center;margin-left:-100px;margin-top:10px;"
+      >
+        <el-button type="primary" @click="submitForm()">提交</el-button>
+        <el-button @click="close()">返回</el-button>
+      </el-form-item>
+    </el-form>
+  </el-card>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted, nextTick } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import Sortable from 'sortablejs'
+
+import { getGenTable, updateGenTable } from "@/apis/gen/gen"
+// import { optionselect as getDictOptionselect } from "@/api/system/dict/type"
+// import { listMenu as getMenuTreeselect } from "@/api/system/menu"
+import basicInfoForm from "./basicInfoForm.vue"
+import genInfoForm from "./genInfoForm.vue"
+
+// 定义类型
+interface DictOption {
+  dictType: string
+  dictName: string
+}
+
+interface Column {
+  columnId: number
+  columnName: string
+  columnComment: string
+  columnType: string
+  javaType: string
+  javaField: string
+  isInsert: string
+  isEdit: string
+  isList: string
+  isQuery: string
+  queryType: string
+  isRequired: string
+  htmlType: string
+  dictType: string
+  sort?: number
+}
+
+interface TableInfo {
+  [key: string]: any
+}
+
+interface Menu {
+  menuId: number
+  [key: string]: any
+}
+
+// 响应式数据
+const activeName = ref('columnInfo')
+const tableHeight = ref(`${document.documentElement.scrollHeight - 245}px`)
+const tables = ref<TableInfo[]>([])
+const columns = ref<Column[]>([])
+const dictOptions = ref<DictOption[]>([])
+const menus = ref<Menu[]>([])
+const info = ref<TableInfo>({})
+
+// 模板引用
+const basicInfoRef = ref<InstanceType<typeof basicInfoForm> | null>(null)
+const genInfoRef = ref<InstanceType<typeof genInfoForm> | null>(null)
+const dragTableRef = ref()
+
+// 路由
+const route = useRoute()
+const router = useRouter()
+
+// 方法
+const handleTree = (data: any[], idKey: string) => {
+  // 这里需要实现树形数据处理逻辑,根据原项目中的实现
+  // 这里仅作示例,您需要根据实际实现调整
+  return data
+}
+
+const submitForm = async () => {
+  if (!basicInfoRef.value || !genInfoRef.value) {
+    ElMessage.error('表单组件未正确加载')
+    return
+  }
+
+  try {
+    const basicForm = basicInfoRef.value.getFormRef()
+    const genForm = genInfoRef.value.getFormRef()
+
+    console.log('基础表单引用:', basicForm)
+    console.log('生成信息表单引用:', genForm)
+
+    if (!basicForm || !genForm) {
+      ElMessage.error('表单引用获取失败')
+      return
+    }
+
+    // 分别验证表单
+    let basicValid = false
+    let genValid = false
+
+    try {
+      basicValid = await basicForm.validate()
+      console.log('基础表单验证通过')
+    } catch (basicError) {
+      console.error('基础表单验证失败:', basicError)
+      ElMessage.error('基本信息表单验证失败,请检查必填项')
+      activeName.value = 'basic'
+      return
+    }
+
+    try {
+      genValid = await genForm.validate()
+      console.log('生成信息表单验证通过')
+    } catch (genError) {
+      console.error('生成信息表单验证失败:', genError)
+      ElMessage.error('生成信息表单验证失败,请检查必填项')
+      activeName.value = 'genInfo'
+      return
+    }
+
+    if (basicValid && genValid) {
+      // 详细检查所有必填字段
+      console.log('提交前的完整 info 数据:', JSON.stringify(info.value, null, 2))
+
+      const requiredFields = [
+        'packageName', 'tableName', 'functionName', 'functionAuthor',
+        'businessName', 'moduleName', 'className', 'tableComment'
+      ]
+
+      // 检查每个字段的具体值
+      requiredFields.forEach(field => {
+        console.log(`${field}:`, info.value[field], '类型:', typeof info.value[field])
+      })
+
+      const missingFields = requiredFields.filter(field => !info.value[field])
+      if (missingFields.length > 0) {
+        ElMessage.error(`以下字段不能为空: ${missingFields.join(', ')}`)
+        activeName.value = 'basic'
+        return
+      }
+
+
+      const genTable = {
+        ...info.value,
+        columns: columns.value,
+        params: {
+          treeCode: info.value.treeCode || '',
+          treeName: info.value.treeName || '',
+          treeParentCode: info.value.treeParentCode || '',
+          parentMenuId: info.value.parentMenuId || ''
+        }
+      }
+
+      console.log('提交的完整数据:', genTable)
+
+      const res = await updateGenTable(genTable)
+      if (res.code === 200) {
+        ElMessage.success(res.msg)
+        close()
+      } else {
+        ElMessage.error(res.msg || '提交失败')
+      }
+    }
+  } catch (error) {
+    console.error('提交过程中发生错误:', error)
+    ElMessage.error("提交失败,请检查表单数据")
+  }
+}
+
+
+const close = () => {
+
+  const obj = {
+    path: "/gen-index",
+    query: {
+      t: Date.now(),
+      pageNum: route.query.pageNum
+    }
+  }
+
+  // 根据您的路由和标签页管理实现调整
+  // 这里假设您有类似的功能来关闭页面
+  router.push(obj)
+}
+
+// 初始化拖拽
+const initSortable = () => {
+  nextTick(() => {
+    if (!dragTableRef.value) return
+
+    const el = dragTableRef.value.$el.querySelectorAll(".el-table__body-wrapper > table > tbody")[0]
+    if (!el) return
+
+    Sortable.create(el, {
+      handle: ".allowDrag",
+      onEnd: (evt) => {
+        const { oldIndex, newIndex } = evt
+        if (oldIndex === undefined || newIndex === undefined) return
+
+        const targetRow = columns.value.splice(oldIndex, 1)[0]
+        columns.value.splice(newIndex, 0, targetRow)
+
+        // 更新排序
+        columns.value.forEach((column, index) => {
+          column.sort = index + 1
+        })
+      }
+    })
+  })
+}
+
+// 生命周期
+onMounted(async () => {
+  const tableId = route.params?.tableId as string
+  if (tableId) {
+    try {
+      // 获取表详细信息
+      const res = await getGenTable(tableId)
+      columns.value = res.data.rows
+      info.value = res.data.info
+      tables.value = res.data.tables
+
+      // 查询字典下拉列表
+      // const dictRes = await getDictOptionselect()
+      // dictOptions.value = dictRes.data
+
+      // 查询菜单下拉列表
+      // const menuRes = await getMenuTreeselect()
+      // menus.value = handleTree(menuRes.data, "menuId")
+
+      // 初始化拖拽
+      initSortable()
+    } catch (error) {
+      console.error('初始化数据失败:', error)
+    }
+  }
+})
+</script>

+ 734 - 0
wxjy-wxjy-web/src/views/gen/genIndex.vue

@@ -0,0 +1,734 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索表单 -->
+    <el-form
+      :model="queryParams"
+      ref="queryFormRef"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="表名称" prop="tableName">
+        <el-input
+          v-model="queryParams.tableName"
+          placeholder="请输入表名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="表描述" prop="tableComment">
+        <el-input
+          v-model="queryParams.tableComment"
+          placeholder="请输入表描述"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="dateRange"
+          style="width: 240px"
+          value-format="YYYY-MM-DD"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="handleDateChange"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :icon="Search" size="small" @click="handleQuery">
+          搜索
+        </el-button>
+        <el-button :icon="Refresh" size="small" @click="resetQuery">
+          重置
+        </el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作按钮 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          :icon="Download"
+          size="small"
+          :disabled="multiple"
+          @click="handleGenTable"
+        >
+          生成
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          :icon="Plus"
+          size="small"
+          @click="openCreateTable"
+        >
+          创建
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          :icon="Upload"
+          size="small"
+          @click="openImportTable"
+        >
+          导入
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          :icon="Edit"
+          size="small"
+          :disabled="single"
+          @click="handleEditTable"
+        >
+          修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          :icon="Delete"
+          size="small"
+          :disabled="multiple"
+          @click="handleDelete"
+        >
+          删除
+        </el-button>
+      </el-col>
+<!--      <RightToolbar :show-search="showSearch" @query-table="getList" />-->
+    </el-row>
+
+    <!-- 数据表格 -->
+    <el-table
+      v-loading="loading"
+      :data="tableList"
+      @selection-change="handleSelectionChange"
+      @sort-change="handleSortChange"
+    >
+      <el-table-column type="selection" align="center" width="55" />
+      <el-table-column label="序号" width="50" align="center">
+        <template #default="{ $index }">
+          <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + $index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="表名称"
+        align="center"
+        prop="tableName"
+        :show-overflow-tooltip="true"
+        width="260"
+        sortable="custom"
+      />
+      <el-table-column
+        label="表描述"
+        align="center"
+        prop="tableComment"
+        :show-overflow-tooltip="true"
+        width="220"
+        sortable="custom"
+      />
+      <el-table-column
+        label="实体"
+        align="center"
+        prop="className"
+        :show-overflow-tooltip="true"
+        width="220"
+      />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="160"
+        sortable="custom"
+      />
+      <el-table-column
+        label="更新时间"
+        align="center"
+        prop="updateTime"
+        width="160"
+        sortable="custom"
+      />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="{ row }">
+          <el-button
+            type="text"
+            size="small"
+            :icon="View"
+            @click="handlePreview(row)"
+            v-has-permi="['tool:gen:preview']"
+          >
+            预览
+          </el-button>
+          <el-button
+            type="text"
+            size="small"
+            :icon="Edit"
+            @click="handleEditTable(row)"
+            v-has-permi="['tool:gen:edit']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            type="text"
+            size="small"
+            :icon="Delete"
+            @click="handleDelete(row)"
+            v-has-permi="['tool:gen:remove']"
+          >
+            删除
+          </el-button>
+          <el-button
+            type="text"
+            size="small"
+            :icon="Refresh"
+            @click="handleSynchDb(row)"
+            v-has-permi="['tool:gen:edit']"
+          >
+            同步
+          </el-button>
+          <el-button
+            type="text"
+            size="small"
+            :icon="Download"
+            @click="handleGenTable(row)"
+          >
+            生成代码
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页组件 -->
+    <Pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 代码预览对话框 -->
+    <el-dialog
+      :title="preview.title"
+      v-model="preview.open"
+      width="80%"
+      top="5vh"
+      append-to-body
+      class="scrollbar"
+      @close="handlePreviewClose"
+    >
+      <el-tabs v-model="preview.activeName" type="border-card">
+        <el-tab-pane
+          v-for="(value, key) in preview.data"
+          :label="getTabLabel(key)"
+          :name="getTabName(key)"
+          :key="key"
+        >
+          <template #label>
+            <span class="tab-label">{{ getTabLabel(key) }}</span>
+          </template>
+          <div class="code-header">
+            <el-tooltip content="复制代码" placement="top">
+              <el-button
+                :icon="DocumentCopy"
+                @click="handleCopy(value)"
+                size="small"
+                text
+              >
+                复制
+              </el-button>
+            </el-tooltip>
+          </div>
+          <div class="code-container">
+            <pre><code class="hljs" v-html="highlightedCode(value, key)"></code></pre>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <!-- 子组件 -->
+    <ImportTable ref="importRef" @ok="handleQuery" />
+    <CreateTable ref="createRef" @ok="handleQuery" />
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, onMounted, nextTick, computed } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
+import type { FormInstance, TableColumnCtx } from 'element-plus'
+import {
+  Search,
+  Refresh,
+  Download,
+  Plus,
+  Upload,
+  Edit,
+  Delete,
+  View,
+  DocumentCopy
+} from '@element-plus/icons-vue'
+
+// API
+import {
+  listTable,
+  previewTable,
+  delTable,
+  genCode,
+  synchDb,
+  type GenTableInfo,
+  type GenTableQuery, batchGenCode
+} from '@/apis/gen/gen'
+
+// 组件
+import ImportTable from './importTable.vue'
+import CreateTable from './createTable.vue'
+// import RightToolbar from '@/components/RightToolbar/NewDeclaredGodds.vue'
+import Pagination from '@/components/Pagination/index.vue'
+
+// Highlight.js 配置
+import hljs from 'highlight.js/lib/core'
+import javascript from 'highlight.js/lib/languages/javascript'
+import xml from 'highlight.js/lib/languages/xml'
+import json from 'highlight.js/lib/languages/json'
+import sql from 'highlight.js/lib/languages/sql'
+import java from 'highlight.js/lib/languages/java'
+import css from 'highlight.js/lib/languages/css'
+
+// 注册语言
+hljs.registerLanguage('javascript', javascript)
+hljs.registerLanguage('xml', xml)
+hljs.registerLanguage('json', json)
+hljs.registerLanguage('sql', sql)
+hljs.registerLanguage('java', java)
+hljs.registerLanguage('css', css)
+
+// 类型定义
+interface PreviewData {
+  open: boolean
+  title: string
+  data: Record<string, string>
+  activeName: string
+}
+
+interface SortParams {
+  prop: string
+  order: 'ascending' | 'descending'
+}
+
+// 路由
+const route = useRoute()
+const router = useRouter()
+
+// Refs
+const queryFormRef = ref<FormInstance>()
+const importRef = ref<InstanceType<typeof ImportTable>>()
+const createRef = ref<InstanceType<typeof CreateTable>>()
+
+// 响应式数据
+const loading = ref(true)
+const uniqueId = ref('')
+const selectedRows = ref<GenTableInfo[]>([])
+const showSearch = ref(true)
+const total = ref(0)
+const tableList = ref<GenTableInfo[]>([])
+const dateRange = ref<string[]>([])
+
+const queryParams = reactive<GenTableQuery & { sort?: string; order?: string }>({
+  pageNum: 1,
+  pageSize: 10,
+  tableName: undefined,
+  tableComment: undefined
+})
+
+const preview = reactive<PreviewData>({
+  open: false,
+  title: '代码预览',
+  data: {},
+  activeName: 'domain.java'
+})
+
+// 计算属性
+const ids = computed(() => selectedRows.value.map(item => item.tableId))
+const tableNames = computed(() => selectedRows.value.map(item => item.tableName))
+const single = computed(() => selectedRows.value.length !== 1)
+const multiple = computed(() => selectedRows.value.length === 0)
+
+// 生命周期
+onMounted(() => {
+  getList()
+})
+
+
+
+// 方法
+/** 查询表集合 */
+const getList = async () => {
+  try {
+    loading.value = true
+
+    // 构建请求参数
+    const params: GenTableQuery = { ...queryParams }
+    if (dateRange.value && dateRange.value.length === 2) {
+      params.beginTime = dateRange.value[0]
+      params.endTime = dateRange.value[1]
+    }
+
+    const response = await listTable(params)
+    console.log(response);
+    if (response.code === 200) {
+      tableList.value = response.rows
+      total.value = response.total
+    } else {
+      ElMessage.error(response.msg || '获取数据失败')
+    }
+  } catch (error) {
+    ElMessage.error('网络错误,请稍后重试')
+    console.error('获取表列表失败:', error)
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+/** 日期范围变化 */
+const handleDateChange = (value: string[]) => {
+  dateRange.value = value
+}
+
+/** 生成代码操作 */
+/** 生成代码操作 */
+const handleGenTable = async (row?: GenTableInfo) => {
+  const targetTableNames = row?.tableName || tableNames.value.join(',')
+
+  if (!targetTableNames) {
+    ElMessage.error('请选择要生成的数据')
+    return
+  }
+
+  try {
+    loading.value = true
+    console.log('开始生成代码,表名:', targetTableNames)
+
+    // 使用 axios 下载
+    const response = await batchGenCode(targetTableNames)
+    console.log('完整响应对象:', response)
+    console.log('响应状态:', response.status)
+    console.log('响应头:', response.headers)
+    console.log('响应数据类型:', typeof response.data)
+    console.log('响应数据构造函数:', response.data?.constructor?.name)
+    console.log('响应数据:', response.data)
+
+    // 检查是否是 Blob
+    if (response.data instanceof Blob) {
+      console.log('是 Blob 对象,大小:', response.data.size, '类型:', response.data.type)
+    } else {
+      console.log('不是 Blob 对象,实际类型:', typeof response.data)
+      // 尝试查看内容
+      try {
+        const text = await new Response(response.data).text()
+        console.log('响应内容:', text.substring(0, 200)) // 只显示前200个字符
+      } catch (e) {
+        console.log('无法读取响应内容')
+      }
+    }
+
+    // 只有确认是 Blob 才创建 URL
+    if (response.data instanceof Blob && response.data.size > 0) {
+      const url = window.URL.createObjectURL(response.data)
+      const link = document.createElement('a')
+      link.href = url
+      link.download = targetTableNames.includes(',') ? 'codes.zip' : `${targetTableNames}.zip`
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+      window.URL.revokeObjectURL(url)
+      ElMessage.success('代码生成成功')
+    } else {
+      throw new Error('响应不是有效的文件数据')
+    }
+
+  } catch (error: any) {
+    console.error('生成代码失败:', error)
+    ElMessage.error('生成代码失败: ' + (error.message || '未知错误'))
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 同步数据库操作 */
+const handleSynchDb = async (row: GenTableInfo) => {
+  try {
+    await ElMessageBox.confirm(
+      `确认要强制同步"${row.tableName}"表结构吗?`,
+      '系统提示',
+      {
+        type: 'warning',
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }
+    )
+
+    const response = await synchDb(row.tableName)
+    if (response.code === 200) {
+      ElMessage.success('同步成功')
+      getList() // 刷新列表
+    } else {
+      ElMessage.error(response.msg || '同步失败')
+    }
+  } catch (error) {
+    // 用户取消操作
+  }
+}
+
+/** 打开导入表弹窗 */
+const openImportTable = () => {
+  importRef.value?.show()
+}
+
+/** 打开创建表弹窗 */
+const openCreateTable = () => {
+  createRef.value?.show()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  dateRange.value = []
+  if (queryFormRef.value) {
+    queryFormRef.value.resetFields()
+  }
+  queryParams.sort = undefined
+  queryParams.order = undefined
+  handleQuery()
+}
+
+/** 预览按钮 */
+const handlePreview = async (row: GenTableInfo) => {
+  try {
+    const response = await previewTable(row.tableId)
+    if (response.code === 200) {
+      preview.data = response.data
+      preview.open = true
+      preview.activeName = Object.keys(response.data)[0]?.split('/').pop()?.split('.vm')[0] || 'domain.java'
+    } else {
+      ElMessage.error(response.msg || '预览失败')
+    }
+  } catch (error) {
+    ElMessage.error('预览失败')
+    console.error('预览失败:', error)
+  }
+}
+
+/** 关闭预览 */
+const handlePreviewClose = () => {
+  preview.data = {}
+  preview.activeName = 'domain.java'
+}
+
+/** 获取标签页名称 */
+const getTabName = (key: string) => {
+  const lastSlashIndex = key.lastIndexOf('/')
+  const vmIndex = key.indexOf('.vm')
+  return key.substring(lastSlashIndex + 1, vmIndex)
+}
+
+/** 获取标签页显示标签 */
+const getTabLabel = (key: string) => {
+  return getTabName(key)
+}
+
+/** 高亮显示代码 */
+const highlightedCode = (code: string, key: string) => {
+  const vmName = getTabName(key)
+  const language = vmName.substring(vmName.lastIndexOf('.') + 1)
+
+  try {
+    const result = hljs.highlight(code || '', {
+      language: getLanguageAlias(language)
+    })
+    return result.value || '&nbsp;'
+  } catch (error) {
+    return code || '&nbsp;'
+  }
+}
+
+/** 获取语言别名 */
+const getLanguageAlias = (language: string): string => {
+  const aliases: Record<string, string> = {
+    'java': 'java',
+    'xml': 'xml',
+    'html': 'xml',
+    'js': 'javascript',
+    'javascript': 'javascript',
+    'json': 'json',
+    'sql': 'sql',
+    'css': 'css',
+    'vue': 'xml'
+  }
+  return aliases[language] || 'plaintext'
+}
+
+/** 复制代码 */
+const handleCopy = async (code: string) => {
+  try {
+    await navigator.clipboard.writeText(code)
+    ElMessage.success('复制成功')
+  } catch (error) {
+    ElMessage.error('复制失败')
+  }
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: GenTableInfo[]) => {
+  selectedRows.value = selection
+}
+
+/** 表格排序 */
+const handleSortChange = ({ prop, order }: SortParams) => {
+  if (prop && order) {
+    queryParams.sort = prop
+    queryParams.order = order === 'ascending' ? 'asc' : 'desc'
+  } else {
+    queryParams.sort = undefined
+    queryParams.order = undefined
+  }
+  getList()
+}
+
+/** 修改按钮操作 */
+const handleEditTable = (row?: GenTableInfo) => {
+  const tableId = row?.tableId || ids.value[0]
+  const tableName = row?.tableName || tableNames.value[0]
+
+  // 使用 name 跳转而不是 path
+  router.push({
+    name: 'GenEdit', // 使用路由名称
+    params: { tableId },
+    query: {
+      pageNum: queryParams.pageNum.toString(),
+      tableName
+    }
+  })
+  /*// 路由跳转到编辑页面
+  router.push({
+    path: `/gen/gen-edit/${tableId}`,
+    query: {
+      pageNum: queryParams.pageNum.toString(),
+      tableName
+    }
+  })*/
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: GenTableInfo) => {
+  const tableIds = row?.tableId || ids.value
+
+  try {
+    await ElMessageBox.confirm(
+      `是否确认删除表编号为"${Array.isArray(tableIds) ? tableIds.join(',') : tableIds}"的数据项?`,
+      '系统提示',
+      {
+        type: 'warning',
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }
+    )
+
+    const response = await delTable(tableIds)
+    if (response.code === 200) {
+      ElMessage.success('删除成功')
+      getList()
+    } else {
+      ElMessage.error(response.msg || '删除失败')
+    }
+  } catch (error) {
+    // 用户取消操作
+  }
+}
+
+// 监听路由变化
+import { watch } from 'vue'
+watch(
+  () => route.query,
+  (newQuery) => {
+    const time = newQuery.t as string
+    if (time && time !== uniqueId.value) {
+      uniqueId.value = time
+      queryParams.pageNum = Number(newQuery.pageNum) || 1
+      getList()
+    }
+  },
+  { immediate: true }
+)
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+.scrollbar {
+  max-height: 70vh;
+  overflow-y: auto;
+}
+
+.code-header {
+  display: flex;
+  justify-content: flex-end;
+  padding: 8px 0;
+  border-bottom: 1px solid #e8e8e8;
+  margin-bottom: 12px;
+}
+
+.code-container {
+  background: #f8f9fa;
+  border-radius: 4px;
+  padding: 16px;
+  overflow-x: auto;
+}
+
+.hljs {
+  background: transparent !important;
+  padding: 0 !important;
+  font-family: 'JetBrains Mono', 'Fira Code', Consolas, 'Courier New', monospace;
+  font-size: 14px;
+  line-height: 1.5;
+}
+
+.tab-label {
+  font-weight: 500;
+}
+
+:deep(.el-table .small-padding) {
+  padding: 8px 0;
+}
+
+:deep(.el-tabs__content) {
+  position: relative;
+}
+
+:deep(.el-tabs--border-card > .el-tabs__content) {
+  padding: 16px;
+}
+</style>

+ 408 - 0
wxjy-wxjy-web/src/views/gen/genInfoForm.vue

@@ -0,0 +1,408 @@
+<template>
+  <el-form ref="formRef" :model="formData" :rules="rules" label-width="150px">
+    <el-row>
+      <el-col :span="12">
+        <el-form-item prop="tplCategory">
+          <span slot="label">生成模板</span>
+          <el-select v-model="formData.tplCategory" @change="handleTplChange">
+            <el-option label="单表(增删改查)" value="crud" />
+            <el-option label="树表(增删改查)" value="tree" />
+            <el-option label="主子表(增删改查)" value="sub" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="tplWebType">
+          <span slot="label">前端类型</span>
+          <el-select v-model="formData.tplWebType">
+            <el-option label="Vue2 Element UI 模版" value="element-ui" />
+            <el-option label="Vue3 Element Plus 模版" value="element-plus" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="packageName">
+          <span slot="label">
+            生成包路径
+            <el-tooltip content="生成在哪个java包下,例如 com.rongji.system" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="formData.packageName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="moduleName">
+          <span slot="label">
+            生成模块名
+            <el-tooltip content="可理解为子系统名,例如 system" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="formData.moduleName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="businessName">
+          <span slot="label">
+            生成业务名
+            <el-tooltip content="可理解为功能英文名,例如 user" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="formData.businessName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="functionName">
+          <span slot="label">
+            生成功能名
+            <el-tooltip content="用作类描述,例如 用户" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="formData.functionName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="genType">
+          <span slot="label">
+            生成代码方式
+            <el-tooltip content="默认为zip压缩包下载,也可以自定义生成路径" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-radio v-model="formData.genType" label="0">zip压缩包</el-radio>
+          <el-radio v-model="formData.genType" label="1">自定义路径</el-radio>
+        </el-form-item>
+      </el-col>
+
+      <!--      <el-col :span="12">
+              <el-form-item>
+                <span slot="label">
+                  上级菜单
+                  <el-tooltip content="分配到指定菜单下,例如 系统管理" placement="top">
+                    <i class="el-icon-question"></i>
+                  </el-tooltip>
+                </span>
+                <el-tree-select
+                  v-model="formData.parentMenuId"
+                  :data="menus"
+                  :props="treeProps"
+                  check-strictly
+                  :render-after-expand="false"
+                  placeholder="请选择系统菜单"
+                />
+              </el-form-item>
+            </el-col>-->
+
+      <el-col :span="24" v-if="formData.genType == '1'">
+        <el-form-item prop="genPath">
+          <span slot="label">
+            自定义路径
+            <el-tooltip content="填写磁盘绝对路径,若不填写,则生成到当前Web项目下" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="formData.genPath">
+            <template #append>
+              <el-dropdown @command="handlePathCommand">
+                <el-button type="primary">
+                  最近路径快速选择
+                  <i class="el-icon-arrow-down el-icon--right"></i>
+                </el-button>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item command="reset">恢复默认的生成基础路径</el-dropdown-item>
+                    <el-dropdown-item command="project">项目根路径</el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </template>
+          </el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <!-- 树表配置 -->
+    <el-row v-show="formData.tplCategory == 'tree'">
+      <h4 class="form-header">其他信息</h4>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            树编码字段
+            <el-tooltip content="树显示的编码字段名, 如:dept_id" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="formData.treeCode" placeholder="请选择">
+            <el-option
+              v-for="(column, index) in formData.columns"
+              :key="index"
+              :label="`${column.columnName}:${column.columnComment}`"
+              :value="column.columnName"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            树父编码字段
+            <el-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="formData.treeParentCode" placeholder="请选择">
+            <el-option
+              v-for="(column, index) in formData.columns"
+              :key="index"
+              :label="`${column.columnName}:${column.columnComment}`"
+              :value="column.columnName"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            树名称字段
+            <el-tooltip content="树节点的显示名称字段名, 如:dept_name" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="formData.treeName" placeholder="请选择">
+            <el-option
+              v-for="(column, index) in formData.columns"
+              :key="index"
+              :label="`${column.columnName}:${column.columnComment}`"
+              :value="column.columnName"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <!-- 主子表配置 -->
+    <el-row v-show="formData.tplCategory == 'sub'">
+      <h4 class="form-header">关联信息</h4>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            关联子表的表名
+            <el-tooltip content="关联子表的表名, 如:sys_user" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="formData.subTableName" placeholder="请选择" @change="handleSubTableChange">
+            <el-option
+              v-for="(table, index) in tables"
+              :key="index"
+              :label="`${table.tableName}:${table.tableComment}`"
+              :value="table.tableName"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            子表关联的外键名
+            <el-tooltip content="子表关联的外键名, 如:user_id" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="formData.subTableFkName" placeholder="请选择">
+            <el-option
+              v-for="(column, index) in subColumns"
+              :key="index"
+              :label="`${column.columnName}:${column.columnComment}`"
+              :value="column.columnName"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script setup>
+import { ref, watch, nextTick } from 'vue'
+
+// Props
+const props = defineProps({
+  info: {
+    type: Object,
+    default: () => ({})
+  },
+  tables: {
+    type: Array,
+    default: () => []
+  },
+  menus: {
+    type: Array,
+    default: () => []
+  }
+})
+
+// Emits
+const emit = defineEmits(['update:info', 'change'])
+
+// Refs
+const formRef = ref(null)
+const subColumns = ref([])
+
+// 表单数据 - 使用 computed 或者直接使用 props.info
+const formData = ref({ ...props.info })
+
+// 监听 props.info 的变化
+watch(() => props.info, (newVal) => {
+  formData.value = { ...newVal }
+}, { deep: true })
+
+// 树形选择器配置
+const treeProps = {
+  value: 'menuId',
+  label: 'menuName',
+  children: 'children'
+}
+
+// 表单验证规则
+const rules = {
+  tplCategory: [
+    { required: true, message: "请选择生成模板", trigger: "blur" }
+  ],
+  packageName: [
+    { required: true, message: "请输入生成包路径", trigger: "blur" }
+  ],
+  moduleName: [
+    { required: true, message: "请输入生成模块名", trigger: "blur" }
+  ],
+  businessName: [
+    { required: true, message: "请输入生成业务名", trigger: "blur" }
+  ],
+  functionName: [
+    { required: true, message: "请输入生成功能名", trigger: "blur" }
+  ],
+}
+
+// 监听器
+watch(() => formData.value.subTableName, (val) => {
+  setSubTableColumns(val)
+})
+
+watch(() => formData.value.tplWebType, (val) => {
+  if (val === '') {
+    formData.value.tplWebType = "element-ui"
+  }
+})
+
+// 确保数据正确同步到父组件
+watch(formData, (newVal) => {
+  // 同步所有字段到父组件的 info
+  Object.keys(newVal).forEach(key => {
+    props.info[key] = newVal[key]
+  })
+}, { deep: true, immediate: true })
+
+// 添加一个方法来强制同步数据
+const syncDataToParent = () => {
+  Object.keys(formData.value).forEach(key => {
+    props.info[key] = formData.value[key]
+  })
+}
+
+// 方法
+const handleSubTableChange = (value) => {
+  formData.value.subTableFkName = ''
+}
+
+const handleTplChange = (value) => {
+  if (value !== 'sub') {
+    formData.value.subTableName = ''
+    formData.value.subTableFkName = ''
+  }
+}
+
+const setSubTableColumns = (value) => {
+  const table = props.tables.find(item => item.tableName === value)
+  if (table) {
+    subColumns.value = table.columns || []
+  } else {
+    subColumns.value = []
+  }
+}
+
+const handlePathCommand = (command) => {
+  switch (command) {
+    case 'reset':
+      formData.value.genPath = '/'
+      break
+    case 'project':
+      formData.value.genPath = process.cwd()
+      break
+  }
+}
+
+// 表单验证方法
+const validate = () => {
+  return new Promise((resolve, reject) => {
+    if (!formRef.value) {
+      reject(new Error('表单未初始化'))
+      return
+    }
+
+    formRef.value.validate((valid) => {
+      if (valid) {
+        resolve(formData.value)
+      } else {
+        reject(new Error('表单验证失败'))
+      }
+    })
+  })
+}
+
+// 重置表单
+const resetFields = () => {
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+
+// 清除验证
+const clearValidate = () => {
+  if (formRef.value) {
+    formRef.value.clearValidate()
+  }
+}
+
+// 暴露方法给父组件
+defineExpose({
+  getFormRef: () => formRef.value,
+  validate,
+  resetFields,
+  clearValidate,
+  syncDataToParent
+})
+</script>
+
+<style scoped>
+.form-header {
+  margin: 10px 0;
+  padding: 10px 0;
+  border-bottom: 1px solid #ebeef5;
+  color: #409eff;
+  font-size: 14px;
+  font-weight: 600;
+}
+
+.el-col {
+  margin-bottom: 10px;
+}
+</style>

+ 238 - 0
wxjy-wxjy-web/src/views/gen/importTable.vue

@@ -0,0 +1,238 @@
+<template>
+  <!-- 导入表 -->
+  <el-dialog
+    :title="title"
+    v-model="visible"
+    width="800px"
+    top="5vh"
+    append-to-body
+    @close="handleClose"
+  >
+    <el-form :model="queryParams" ref="queryFormRef" size="small" :inline="true">
+      <el-form-item label="表名称" prop="tableName">
+        <el-input
+          v-model="queryParams.tableName"
+          placeholder="请输入表名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="表描述" prop="tableComment">
+        <el-input
+          v-model="queryParams.tableComment"
+          placeholder="请输入表描述"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :icon="Search" size="small" @click="handleQuery">
+          搜索
+        </el-button>
+        <el-button :icon="Refresh" size="small" @click="resetQuery">
+          重置
+        </el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row>
+      <el-table
+        @row-click="clickRow"
+        ref="tableRef"
+        :data="dbTableList"
+        @selection-change="handleSelectionChange"
+        height="260px"
+        v-loading="loading"
+      >
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="tableName" label="表名称" :show-overflow-tooltip="true" />
+        <el-table-column prop="tableComment" label="表描述" :show-overflow-tooltip="true" />
+        <el-table-column prop="createTime" label="创建时间" width="180" />
+        <el-table-column prop="updateTime" label="更新时间" width="180" />
+      </el-table>
+
+      <Pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="handlePaginationChange"
+      />
+    </el-row>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="handleImportTable">确 定</el-button>
+        <el-button @click="visible = false">取 消</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, onMounted, nextTick } from 'vue'
+import { ElMessage, ElMessageBox, ElTable } from 'element-plus'
+import type { FormInstance } from 'element-plus'
+import { Search, Refresh } from '@element-plus/icons-vue'
+
+// API
+import { listDbTable, importTable, type DbTableInfo, type GenTableQuery } from '@/apis/gen/gen'
+import Pagination from '@/components/Pagination/index.vue'
+
+// 类型定义
+interface SelectionItem {
+  tableName: string
+  tableComment: string
+  createTime: string
+  updateTime: string
+}
+
+// Emits
+const emit = defineEmits<{
+  ok: []
+}>()
+
+// Refs
+const queryFormRef = ref<FormInstance>()
+const tableRef = ref<InstanceType<typeof ElTable>>()
+
+// 响应式数据
+const visible = ref(false)
+const loading = ref(false)
+const title = ref('导入表')
+const total = ref(0)
+const selectedTables = ref<SelectionItem[]>([])
+const dbTableList = ref<DbTableInfo[]>([])
+
+const queryParams = reactive<GenTableQuery>({
+  pageNum: 1,
+  pageSize: 10,
+  tableName: undefined,
+  tableComment: undefined
+})
+
+// 方法
+/** 显示弹框 */
+const show = () => {
+  visible.value = true
+  getList()
+}
+
+/** 点击行 */
+const clickRow = (row: SelectionItem) => {
+  if (tableRef.value) {
+    tableRef.value.toggleRowSelection(row)
+  }
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: SelectionItem[]) => {
+  selectedTables.value = selection
+}
+
+/** 查询表数据 */
+const getList = async () => {
+  try {
+    loading.value = true
+    const response = await listDbTable(queryParams)
+    console.log('获取数据库表列表:', response)
+    if (response.code === 200) {
+      dbTableList.value = response.rows
+      total.value = response.total
+    } else {
+      ElMessage.error(response.msg || '获取数据失败')
+    }
+  } catch (error) {
+    ElMessage.error('网络错误,请稍后重试')
+    console.error('获取数据库表列表失败:', error)
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 分页事件处理 */
+const handlePaginationChange = (pagination: any) => {
+  console.log('分页变化:', pagination)
+  // 更新分页参数
+  queryParams.pageNum = pagination.page
+  queryParams.pageSize = pagination.limit
+  // 重新获取数据
+  getList()
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNum = 1  // 搜索时重置到第一页
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  if (queryFormRef.value) {
+    queryFormRef.value.resetFields()
+  }
+  queryParams.pageNum = 1  // 重置时回到第一页
+  queryParams.tableName = undefined
+  queryParams.tableComment = undefined
+  getList()
+}
+
+/** 导入按钮操作 */
+const handleImportTable = async () => {
+  const tableNames = selectedTables.value.map(item => item.tableName).join(',')
+
+  if (!tableNames) {
+    ElMessage.error('请选择要导入的表')
+    return
+  }
+
+  try {
+    const response = await importTable({ tables: tableNames })
+    if (response.code === 200) {
+      ElMessage.success(response.msg || '导入成功')
+      visible.value = false
+      emit('ok')
+    } else {
+      ElMessage.error(response.msg || '导入失败')
+    }
+  } catch (error) {
+    ElMessage.error('导入失败')
+    console.error('导入表失败:', error)
+  }
+}
+
+/** 关闭对话框 */
+const handleClose = () => {
+  // 重置数据
+  selectedTables.value = []
+  if (queryFormRef.value) {
+    queryFormRef.value.resetFields()
+  }
+  queryParams.pageNum = 1
+  queryParams.pageSize = 10
+  queryParams.tableName = undefined
+  queryParams.tableComment = undefined
+}
+
+// 暴露方法给父组件
+defineExpose({
+  show
+})
+</script>
+
+<style scoped>
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+}
+
+:deep(.el-table) {
+  margin-bottom: 16px;
+}
+
+:deep(.el-table .el-table__body tr:hover > td) {
+  background-color: #f5f7fa;
+  cursor: pointer;
+}
+</style>