From fb3b3e41804abeeb4a54d9df3030bc3cdb75c245 Mon Sep 17 00:00:00 2001
From: 吴健 <14790700720@163.com>
Date: 星期三, 27 十一月 2024 10:21:02 +0800
Subject: [PATCH] add 工艺配方

---
 billion-ui/src/api/main/bs/formulaInfo.js                                                      |   50 +
 billion-ui/package.json                                                                        |    1 
 billion-ui/vue.config.js                                                                       |    7 
 billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaInfoService.java              |   64 +
 billion-ui/src/router/index.js                                                                 |   16 
 billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaChildInfoMapper.java            |   64 +
 billion-ui/src/utils/auth.js                                                                   |    6 
 billion-ui/src/views/main/om/info/index.vue                                                    |   18 
 billion-main/src/main/resources/mapper/bs/BsFormulaInfoMapper.xml                              |  104 +++
 billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaChildInfoServiceImpl.java |  111 +++
 billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaChildInfoController.java    |  105 +++
 billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaInfoController.java         |  114 +++
 billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaInfoServiceImpl.java      |  133 ++++
 billion-ui/src/utils/request.js                                                                |    4 
 billion-ui/src/plugins/download.js                                                             |   18 
 billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaInfo.java                       |   44 +
 billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaChildInfoService.java         |   64 +
 billion-ui/src/api/main/bs/formulaChildinfo.js                                                 |   44 +
 billion-ui/src/views/main/bs/formulaInfoChild/index.vue                                        |  404 ++++++++++++
 billion-ui/src/views/main/bs/formulaInfo/index.vue                                             |  335 ++++++++++
 billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaChildInfo.java                  |   64 +
 billion-ui/src/views/tool/build/RightPanel.vue                                                 |    2 
 billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaInfoMapper.java                 |   64 +
 billion-main/src/main/resources/mapper/bs/BsFormulaChildInfoMapper.xml                         |  130 +++
 24 files changed, 1,929 insertions(+), 37 deletions(-)

diff --git a/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaChildInfoController.java b/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaChildInfoController.java
new file mode 100644
index 0000000..3f71060
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaChildInfoController.java
@@ -0,0 +1,105 @@
+package com.billion.main.bs.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.billion.common.utils.poi.ExcelUtil;
+import com.billion.main.bs.domain.BsFormulaChildInfo;
+import com.billion.main.bs.service.IBsFormulaChildInfoService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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 com.billion.common.annotation.Log;
+import com.billion.common.core.controller.BaseController;
+import com.billion.common.core.domain.AjaxResult;
+import com.billion.common.enums.BusinessType;
+import com.billion.common.core.page.TableDataInfo;
+
+/**
+ * 閰嶆柟閰嶇疆瀛愪俊鎭疌ontroller
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@RestController
+@RequestMapping("/formulaChildInfo")
+public class BsFormulaChildInfoController extends BaseController
+{
+    @Autowired
+    private IBsFormulaChildInfoService bsFormulaChildInfoService;
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        startPage();
+        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.selectBsFormulaChildInfoList(bsFormulaChildInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:export')")
+    @Log(title = "閰嶆柟閰嶇疆瀛愪俊鎭�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        List<BsFormulaChildInfo> list = bsFormulaChildInfoService.selectBsFormulaChildInfoList(bsFormulaChildInfo);
+        ExcelUtil<BsFormulaChildInfo> util = new ExcelUtil<BsFormulaChildInfo>(BsFormulaChildInfo.class);
+        util.exportExcel(response, list, "閰嶆柟閰嶇疆瀛愪俊鎭暟鎹�");
+    }
+
+    /**
+     * 鑾峰彇閰嶆柟閰嶇疆瀛愪俊鎭缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(bsFormulaChildInfoService.selectBsFormulaChildInfoById(id));
+    }
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:add')")
+    @Log(title = "閰嶆柟閰嶇疆瀛愪俊鎭�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        return toAjax(bsFormulaChildInfoService.insertBsFormulaChildInfo(bsFormulaChildInfo));
+    }
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:edit')")
+    @Log(title = "閰嶆柟閰嶇疆瀛愪俊鎭�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        return toAjax(bsFormulaChildInfoService.updateBsFormulaChildInfo(bsFormulaChildInfo));
+    }
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:remove')")
+    @Log(title = "閰嶆柟閰嶇疆瀛愪俊鎭�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(bsFormulaChildInfoService.deleteBsFormulaChildInfoByIds(ids));
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaInfoController.java b/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaInfoController.java
new file mode 100644
index 0000000..3a69b12
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/controller/BsFormulaInfoController.java
@@ -0,0 +1,114 @@
+package com.billion.main.bs.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.billion.common.core.domain.R;
+import com.billion.common.utils.poi.ExcelUtil;
+import com.billion.main.bs.domain.BsFormulaInfo;
+import com.billion.main.bs.service.IBsFormulaInfoService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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 com.billion.common.annotation.Log;
+import com.billion.common.core.controller.BaseController;
+import com.billion.common.core.domain.AjaxResult;
+import com.billion.common.enums.BusinessType;
+import com.billion.common.core.page.TableDataInfo;
+
+/**
+ * 閰嶆柟閰嶇疆Controller
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@RestController
+@RequestMapping("/formulaInfo")
+public class BsFormulaInfoController extends BaseController
+{
+    @Autowired
+    private IBsFormulaInfoService bsFormulaInfoService;
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BsFormulaInfo bsFormulaInfo)
+    {
+        startPage();
+        List<BsFormulaInfo> list = bsFormulaInfoService.selectBsFormulaInfoList(bsFormulaInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭閰嶆柟閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:export')")
+    @Log(title = "閰嶆柟閰嶇疆", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BsFormulaInfo bsFormulaInfo)
+    {
+        List<BsFormulaInfo> list = bsFormulaInfoService.selectBsFormulaInfoList(bsFormulaInfo);
+        ExcelUtil<BsFormulaInfo> util = new ExcelUtil<BsFormulaInfo>(BsFormulaInfo.class);
+        util.exportExcel(response, list, "閰嶆柟閰嶇疆鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇閰嶆柟閰嶇疆璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(bsFormulaInfoService.selectBsFormulaInfoById(id));
+    }
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:add')")
+    @Log(title = "閰嶆柟閰嶇疆", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BsFormulaInfo bsFormulaInfo)
+    {
+        return toAjax(bsFormulaInfoService.insertBsFormulaInfo(bsFormulaInfo));
+    }
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:edit')")
+    @Log(title = "閰嶆柟閰嶇疆", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BsFormulaInfo bsFormulaInfo)
+    {
+        return toAjax(bsFormulaInfoService.updateBsFormulaInfo(bsFormulaInfo));
+    }
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('main:info:remove')")
+    @Log(title = "閰嶆柟閰嶇疆", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(bsFormulaInfoService.deleteBsFormulaInfoByIds(ids));
+    }
+
+    @GetMapping("/getOne")
+    public R getOne(BsFormulaInfo bsFormulaInfo){
+        BsFormulaInfo one = bsFormulaInfoService.getOne(new LambdaQueryWrapper<BsFormulaInfo>()
+                .eq(BsFormulaInfo::getFormulaCode, bsFormulaInfo.getFormulaCode()));
+        return R.ok(one);
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaChildInfo.java b/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaChildInfo.java
new file mode 100644
index 0000000..961b6f7
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaChildInfo.java
@@ -0,0 +1,64 @@
+package com.billion.main.bs.domain;
+
+import com.billion.common.annotation.Excel;
+import com.billion.main.common.BaseEntity;
+import lombok.Data;
+
+/**
+ * 閰嶆柟閰嶇疆瀛愪俊鎭璞� bs_formula_child_info
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@Data
+public class BsFormulaChildInfo extends BaseEntity
+{
+    /** 閰嶆柟缂栫爜 */
+    @Excel(name = "閰嶆柟缂栫爜")
+    private String formulaCode;
+
+    /** 浜х嚎 */
+    @Excel(name = "浜х嚎缂栫爜")
+    private String lineCode;
+
+    /** 宸ヤ綅缂栧彿 */
+    @Excel(name = "宸ヤ綅缂栧彿")
+    private String locationCode;
+
+    /** 浜у搧缂栧彿 */
+    @Excel(name = "浜у搧缂栧彿")
+    private String productCode;
+
+    /** 鎿嶄綔鍐呭 */
+    @Excel(name = "鎿嶄綔鍐呭")
+    private String operationContent;
+
+    /** 鎿嶄綔绫诲瀷 */
+    @Excel(name = "鎿嶄綔绫诲瀷", readConverterExp = "1=鎵弿浜у搧鏉$爜,2=鎷х揣鏁版嵁閲囬泦")
+    private String operationType;
+
+    /** 鎺掑簭 */
+    @Excel(name = "鎺掑簭")
+    private Integer stepSort;
+
+    /** 鍙傛暟缂栫爜 */
+    @Excel(name = "鍙傛暟缂栫爜")
+    private String paramCode;
+
+    /** 鍥剧墖 */
+    private String picture;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String remarks;
+
+    /** 閲囬泦鏁版嵁 */
+    private String collectData;
+
+    /** 缁撴灉 */
+    private String results;
+
+
+
+
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaInfo.java b/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaInfo.java
new file mode 100644
index 0000000..06711be
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/domain/BsFormulaInfo.java
@@ -0,0 +1,44 @@
+package com.billion.main.bs.domain;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.billion.common.annotation.Excel;
+import com.billion.main.common.BaseEntity;
+
+/**
+ * 閰嶆柟閰嶇疆瀵硅薄 bs_formula_info
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@Data
+public class BsFormulaInfo extends BaseEntity
+{
+
+    /** 浜у搧缂栫爜 */
+    @Excel(name = "浜у搧缂栫爜")
+    private String productCode;
+
+    /** 浜у搧鍚嶇О */
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productName;
+
+    /** 閰嶆柟缂栫爜 */
+    @Excel(name = "閰嶆柟缂栫爜")
+    private String formulaCode;
+
+    /** 閰嶆柟鍚嶇О */
+    @Excel(name = "閰嶆柟鍚嶇О")
+    private String formulaName;
+
+    /** 鐘舵�� */
+    @Excel(name = "鐘舵��", readConverterExp = "1=鍚敤,0=鏈惎鐢�")
+    private String status;
+
+    @Excel(name = "澶囨敞")
+    private String remark;
+
+
+
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaChildInfoMapper.java b/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaChildInfoMapper.java
new file mode 100644
index 0000000..885b6d2
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaChildInfoMapper.java
@@ -0,0 +1,64 @@
+package com.billion.main.bs.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.billion.main.bs.domain.BsFormulaChildInfo;
+
+import java.util.List;
+
+/**
+ * 閰嶆柟閰嶇疆瀛愪俊鎭疢apper鎺ュ彛
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+public interface BsFormulaChildInfoMapper extends BaseMapper<BsFormulaChildInfo>
+{
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    public BsFormulaChildInfo selectBsFormulaChildInfoById(Long id);
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭泦鍚�
+     */
+    public List<BsFormulaChildInfo> selectBsFormulaChildInfoList(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    public int insertBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    public int updateBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaChildInfoById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaChildInfoByIds(Long[] ids);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaInfoMapper.java b/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaInfoMapper.java
new file mode 100644
index 0000000..4f6bce5
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/mapper/BsFormulaInfoMapper.java
@@ -0,0 +1,64 @@
+package com.billion.main.bs.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.billion.main.bs.domain.BsFormulaInfo;
+
+import java.util.List;
+
+/**
+ * 閰嶆柟閰嶇疆Mapper鎺ュ彛
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+public interface BsFormulaInfoMapper extends BaseMapper<BsFormulaInfo>
+{
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 閰嶆柟閰嶇疆
+     */
+    public BsFormulaInfo selectBsFormulaInfoById(Long id);
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆鍒楄〃
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 閰嶆柟閰嶇疆闆嗗悎
+     */
+    public List<BsFormulaInfo> selectBsFormulaInfoList(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    public int insertBsFormulaInfo(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    public int updateBsFormulaInfo(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaInfoById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaInfoByIds(Long[] ids);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaChildInfoService.java b/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaChildInfoService.java
new file mode 100644
index 0000000..ae5c5e6
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaChildInfoService.java
@@ -0,0 +1,64 @@
+package com.billion.main.bs.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.billion.main.bs.domain.BsFormulaChildInfo;
+
+import java.util.List;
+
+/**
+ * 閰嶆柟閰嶇疆瀛愪俊鎭疭ervice鎺ュ彛
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+public interface IBsFormulaChildInfoService extends IService<BsFormulaChildInfo>
+{
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    public BsFormulaChildInfo selectBsFormulaChildInfoById(Long id);
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭泦鍚�
+     */
+    public List<BsFormulaChildInfo> selectBsFormulaChildInfoList(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    public int insertBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    public int updateBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo);
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑閰嶆柟閰嶇疆瀛愪俊鎭富閿泦鍚�
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaChildInfoByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaChildInfoById(Long id);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaInfoService.java b/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaInfoService.java
new file mode 100644
index 0000000..7e21773
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/IBsFormulaInfoService.java
@@ -0,0 +1,64 @@
+package com.billion.main.bs.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.billion.main.bs.domain.BsFormulaInfo;
+
+import java.util.List;
+
+/**
+ * 閰嶆柟閰嶇疆Service鎺ュ彛
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+public interface IBsFormulaInfoService extends IService<BsFormulaInfo>
+{
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 閰嶆柟閰嶇疆
+     */
+    public BsFormulaInfo selectBsFormulaInfoById(Long id);
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆鍒楄〃
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 閰嶆柟閰嶇疆闆嗗悎
+     */
+    public List<BsFormulaInfo> selectBsFormulaInfoList(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    public int insertBsFormulaInfo(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    public int updateBsFormulaInfo(BsFormulaInfo bsFormulaInfo);
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑閰嶆柟閰嶇疆涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaInfoByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆淇℃伅
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsFormulaInfoById(Long id);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaChildInfoServiceImpl.java b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaChildInfoServiceImpl.java
new file mode 100644
index 0000000..2955dbc
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaChildInfoServiceImpl.java
@@ -0,0 +1,111 @@
+package com.billion.main.bs.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.billion.common.core.domain.entity.SysUser;
+import com.billion.common.core.domain.model.LoginUser;
+import com.billion.common.utils.DateUtils;
+import com.billion.common.utils.SecurityUtils;
+import com.billion.main.bs.domain.BsFormulaChildInfo;
+import com.billion.main.bs.mapper.BsFormulaChildInfoMapper;
+import com.billion.main.bs.service.IBsFormulaChildInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 閰嶆柟閰嶇疆瀛愪俊鎭疭ervice涓氬姟灞傚鐞�
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@Service
+public class BsFormulaChildInfoServiceImpl extends ServiceImpl<BsFormulaChildInfoMapper, BsFormulaChildInfo> implements IBsFormulaChildInfoService
+{
+    @Autowired
+    private BsFormulaChildInfoMapper bsFormulaChildInfoMapper;
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    @Override
+    public BsFormulaChildInfo selectBsFormulaChildInfoById(Long id)
+    {
+        return bsFormulaChildInfoMapper.selectBsFormulaChildInfoById(id);
+    }
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 閰嶆柟閰嶇疆瀛愪俊鎭�
+     */
+    @Override
+    public List<BsFormulaChildInfo> selectBsFormulaChildInfoList(BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        return bsFormulaChildInfoMapper.selectBsFormulaChildInfoList(bsFormulaChildInfo);
+    }
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        bsFormulaChildInfo.setCreateTime(DateUtils.getNowDate());
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        bsFormulaChildInfo.setCreateTime(new Date());
+        bsFormulaChildInfo.setUpdateTime(new Date());
+        bsFormulaChildInfo.setCreateBy(user.getUserName());
+        bsFormulaChildInfo.setUpdateBy(user.getUserName());
+        return bsFormulaChildInfoMapper.insertBsFormulaChildInfo(bsFormulaChildInfo);
+    }
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param bsFormulaChildInfo 閰嶆柟閰嶇疆瀛愪俊鎭�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateBsFormulaChildInfo(BsFormulaChildInfo bsFormulaChildInfo)
+    {
+        bsFormulaChildInfo.setUpdateTime(DateUtils.getNowDate());
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        bsFormulaChildInfo.setUpdateBy(user.getUserName());
+        return bsFormulaChildInfoMapper.updateBsFormulaChildInfo(bsFormulaChildInfo);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsFormulaChildInfoByIds(Long[] ids)
+    {
+        return bsFormulaChildInfoMapper.deleteBsFormulaChildInfoByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭俊鎭�
+     * 
+     * @param id 閰嶆柟閰嶇疆瀛愪俊鎭富閿�
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsFormulaChildInfoById(Long id)
+    {
+        return bsFormulaChildInfoMapper.deleteBsFormulaChildInfoById(id);
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaInfoServiceImpl.java b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaInfoServiceImpl.java
new file mode 100644
index 0000000..e8f2e33
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsFormulaInfoServiceImpl.java
@@ -0,0 +1,133 @@
+package com.billion.main.bs.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.billion.common.core.domain.entity.SysUser;
+import com.billion.common.core.domain.model.LoginUser;
+import com.billion.common.exception.ServiceException;
+import com.billion.common.utils.DateUtils;
+import com.billion.common.utils.SecurityUtils;
+import com.billion.main.bs.domain.BsFormulaInfo;
+import com.billion.main.bs.mapper.BsFormulaInfoMapper;
+import com.billion.main.bs.service.IBsFormulaInfoService;
+import com.billion.main.common.BaseEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 閰嶆柟閰嶇疆Service涓氬姟灞傚鐞�
+ * 
+ * @author Billion
+ * @date 2024-11-26
+ */
+@Service
+public class BsFormulaInfoServiceImpl extends ServiceImpl<BsFormulaInfoMapper, BsFormulaInfo> implements IBsFormulaInfoService
+{
+    @Autowired
+    private BsFormulaInfoMapper bsFormulaInfoMapper;
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 閰嶆柟閰嶇疆
+     */
+    @Override
+    public BsFormulaInfo selectBsFormulaInfoById(Long id)
+    {
+        return bsFormulaInfoMapper.selectBsFormulaInfoById(id);
+    }
+
+    /**
+     * 鏌ヨ閰嶆柟閰嶇疆鍒楄〃
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 閰嶆柟閰嶇疆
+     */
+    @Override
+    public List<BsFormulaInfo> selectBsFormulaInfoList(BsFormulaInfo bsFormulaInfo)
+    {
+        return bsFormulaInfoMapper.selectBsFormulaInfoList(bsFormulaInfo);
+    }
+
+    /**
+     * 鏂板閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertBsFormulaInfo(BsFormulaInfo bsFormulaInfo)
+    {
+        List<BsFormulaInfo> check = this.list(new LambdaQueryWrapper<BsFormulaInfo>().eq(BsFormulaInfo::getFormulaCode, bsFormulaInfo.getFormulaCode()));
+        if (CollUtil.isNotEmpty(check)){
+            throw new ServiceException("宸插瓨鍦ㄦ閰嶆柟缂栫爜");
+        }
+        List<BsFormulaInfo> check1 = this.list(new LambdaQueryWrapper<BsFormulaInfo>().eq(BsFormulaInfo::getProductCode, bsFormulaInfo.getProductCode()));
+        if (CollUtil.isNotEmpty(check1)){
+            throw new ServiceException("宸插瓨鍦ㄦ浜у搧缂栫爜");
+        }
+        bsFormulaInfo.setCreateTime(DateUtils.getNowDate());
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        bsFormulaInfo.setCreateTime(new Date());
+        bsFormulaInfo.setUpdateTime(new Date());
+        bsFormulaInfo.setCreateBy(user.getUserName());
+        bsFormulaInfo.setUpdateBy(user.getUserName());
+        return bsFormulaInfoMapper.insertBsFormulaInfo(bsFormulaInfo);
+    }
+
+    /**
+     * 淇敼閰嶆柟閰嶇疆
+     * 
+     * @param bsFormulaInfo 閰嶆柟閰嶇疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateBsFormulaInfo(BsFormulaInfo bsFormulaInfo)
+    {
+        List<BsFormulaInfo> check = this.list(new LambdaQueryWrapper<BsFormulaInfo>().eq(BsFormulaInfo::getFormulaCode, bsFormulaInfo.getFormulaCode())
+                .notIn(BaseEntity::getId,bsFormulaInfo.getId()));
+        if (CollUtil.isNotEmpty(check)){
+            throw new ServiceException("宸插瓨鍦ㄦ閰嶆柟缂栫爜");
+        }
+        List<BsFormulaInfo> check1 = this.list(new LambdaQueryWrapper<BsFormulaInfo>().eq(BsFormulaInfo::getProductCode, bsFormulaInfo.getProductCode())
+                .notIn(BaseEntity::getId,bsFormulaInfo.getId()));
+        if (CollUtil.isNotEmpty(check1)){
+            throw new ServiceException("宸插瓨鍦ㄦ浜у搧缂栫爜");
+        }
+        bsFormulaInfo.setUpdateTime(DateUtils.getNowDate());
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        bsFormulaInfo.setUpdateBy(user.getUserName());
+        return bsFormulaInfoMapper.updateBsFormulaInfo(bsFormulaInfo);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎閰嶆柟閰嶇疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑閰嶆柟閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsFormulaInfoByIds(Long[] ids)
+    {
+        return bsFormulaInfoMapper.deleteBsFormulaInfoByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎閰嶆柟閰嶇疆淇℃伅
+     * 
+     * @param id 閰嶆柟閰嶇疆涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsFormulaInfoById(Long id)
+    {
+        return bsFormulaInfoMapper.deleteBsFormulaInfoById(id);
+    }
+}
diff --git a/billion-main/src/main/resources/mapper/bs/BsFormulaChildInfoMapper.xml b/billion-main/src/main/resources/mapper/bs/BsFormulaChildInfoMapper.xml
new file mode 100644
index 0000000..376126c
--- /dev/null
+++ b/billion-main/src/main/resources/mapper/bs/BsFormulaChildInfoMapper.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.billion.main.bs.mapper.BsFormulaChildInfoMapper">
+    
+    <resultMap type="BsFormulaChildInfo" id="BsFormulaChildInfoResult">
+        <result property="id"    column="id"    />
+        <result property="lineCode"    column="line_code"    />
+        <result property="locationCode"    column="location_code"    />
+        <result property="productCode"    column="product_code"    />
+        <result property="operationContent"    column="operation_content"    />
+        <result property="operationType"    column="operation_type"    />
+        <result property="stepSort"    column="step_sort"    />
+        <result property="paramCode"    column="param_code"    />
+        <result property="picture"    column="picture"    />
+        <result property="remarks"    column="remarks"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="collectData"    column="collect_data"    />
+        <result property="results"    column="results"    />
+        <result property="formulaCode"    column="formula_code"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectBsFormulaChildInfoVo">
+        select id, line_code, location_code, product_code, operation_content, operation_type, step_sort, param_code, picture, remarks, create_by, create_time, update_by, update_time, collect_data, results, formula_code, del_flag from bs_formula_child_info
+    </sql>
+
+    <select id="selectBsFormulaChildInfoList" parameterType="BsFormulaChildInfo" resultMap="BsFormulaChildInfoResult">
+        <include refid="selectBsFormulaChildInfoVo"/>
+        <where>  
+            <if test="lineCode != null  and lineCode != ''"> and line_code = #{lineCode}</if>
+            <if test="locationCode != null  and locationCode != ''"> and location_code = #{locationCode}</if>
+            <if test="productCode != null  and productCode != ''"> and product_code = #{productCode}</if>
+            <if test="operationType != null  and operationType != ''"> and operation_type = #{operationType}</if>
+            <if test="stepSort != null "> and step_sort = #{stepSort}</if>
+            <if test="paramCode != null  and paramCode != ''"> and param_code = #{paramCode}</if>
+            <if test="formulaCode != null  and formulaCode != ''"> and formula_code = #{formulaCode}</if>
+             and del_flag = "0"
+        </where>
+    </select>
+    
+    <select id="selectBsFormulaChildInfoById" parameterType="Long" resultMap="BsFormulaChildInfoResult">
+        <include refid="selectBsFormulaChildInfoVo"/>
+        where id = #{id}
+        and del_flag = "0"
+    </select>
+
+    <insert id="insertBsFormulaChildInfo" parameterType="BsFormulaChildInfo">
+        insert into bs_formula_child_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="lineCode != null and lineCode != ''">line_code,</if>
+            <if test="locationCode != null and locationCode != ''">location_code,</if>
+            <if test="productCode != null and productCode != ''">product_code,</if>
+            <if test="operationContent != null and operationContent != ''">operation_content,</if>
+            <if test="operationType != null and operationType != ''">operation_type,</if>
+            <if test="stepSort != null">step_sort,</if>
+            <if test="paramCode != null and paramCode != ''">param_code,</if>
+            <if test="picture != null">picture,</if>
+            <if test="remarks != null">remarks,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="collectData != null">collect_data,</if>
+            <if test="results != null">results,</if>
+            <if test="formulaCode != null">formula_code,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="lineCode != null and lineCode != ''">#{lineCode},</if>
+            <if test="locationCode != null and locationCode != ''">#{locationCode},</if>
+            <if test="productCode != null and productCode != ''">#{productCode},</if>
+            <if test="operationContent != null and operationContent != ''">#{operationContent},</if>
+            <if test="operationType != null and operationType != ''">#{operationType},</if>
+            <if test="stepSort != null">#{stepSort},</if>
+            <if test="paramCode != null and paramCode != ''">#{paramCode},</if>
+            <if test="picture != null">#{picture},</if>
+            <if test="remarks != null">#{remarks},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="collectData != null">#{collectData},</if>
+            <if test="results != null">#{results},</if>
+            <if test="formulaCode != null">#{formulaCode},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBsFormulaChildInfo" parameterType="BsFormulaChildInfo">
+        update bs_formula_child_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="lineCode != null and lineCode != ''">line_code = #{lineCode},</if>
+            <if test="locationCode != null and locationCode != ''">location_code = #{locationCode},</if>
+            <if test="productCode != null and productCode != ''">product_code = #{productCode},</if>
+            <if test="operationContent != null and operationContent != ''">operation_content = #{operationContent},</if>
+            <if test="operationType != null and operationType != ''">operation_type = #{operationType},</if>
+            <if test="stepSort != null">step_sort = #{stepSort},</if>
+            <if test="paramCode != null and paramCode != ''">param_code = #{paramCode},</if>
+            <if test="picture != null">picture = #{picture},</if>
+            <if test="remarks != null">remarks = #{remarks},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="collectData != null">collect_data = #{collectData},</if>
+            <if test="results != null">results = #{results},</if>
+            <if test="formulaCode != null">formula_code = #{formulaCode},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteBsFormulaChildInfoById" parameterType="Long">
+        update bs_formula_child_info set del_flag = "1" where id = #{id}
+    </update>
+
+    <update id="deleteBsFormulaChildInfoByIds" parameterType="String">
+        update bs_formula_child_info set del_flag = "1" where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/billion-main/src/main/resources/mapper/bs/BsFormulaInfoMapper.xml b/billion-main/src/main/resources/mapper/bs/BsFormulaInfoMapper.xml
new file mode 100644
index 0000000..a15c638
--- /dev/null
+++ b/billion-main/src/main/resources/mapper/bs/BsFormulaInfoMapper.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.billion.main.bs.mapper.BsFormulaInfoMapper">
+    
+    <resultMap type="BsFormulaInfo" id="BsFormulaInfoResult">
+        <result property="id"    column="id"    />
+        <result property="productCode"    column="product_code"    />
+        <result property="productName"    column="product_name"    />
+        <result property="formulaCode"    column="formula_code"    />
+        <result property="formulaName"    column="formula_name"    />
+        <result property="status"    column="status"    />
+        <result property="remark"    column="remark"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectBsFormulaInfoVo">
+        select id, product_code, product_name, formula_code, formula_name, status, remark, create_by, create_time, update_by, update_time, del_flag from bs_formula_info
+    </sql>
+
+    <select id="selectBsFormulaInfoList" parameterType="BsFormulaInfo" resultMap="BsFormulaInfoResult">
+        <include refid="selectBsFormulaInfoVo"/>
+        <where>  
+            <if test="productCode != null  and productCode != ''"> and product_code = #{productCode}</if>
+            <if test="productName != null  and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
+            <if test="formulaCode != null  and formulaCode != ''"> and formula_code = #{formulaCode}</if>
+            <if test="formulaName != null  and formulaName != ''"> and formula_name like concat('%', #{formulaName}, '%')</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            and del_flag = "0"
+        </where>
+    </select>
+    
+    <select id="selectBsFormulaInfoById" parameterType="Long" resultMap="BsFormulaInfoResult">
+        <include refid="selectBsFormulaInfoVo"/>
+        where id = #{id}
+        and del_flag = "0"
+    </select>
+
+    <insert id="insertBsFormulaInfo" parameterType="BsFormulaInfo">
+        insert into bs_formula_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="productCode != null and productCode != ''">product_code,</if>
+            <if test="productName != null and productName != ''">product_name,</if>
+            <if test="formulaCode != null and formulaCode != ''">formula_code,</if>
+            <if test="formulaName != null and formulaName != ''">formula_name,</if>
+            <if test="status != null and status != ''">status,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="productCode != null and productCode != ''">#{productCode},</if>
+            <if test="productName != null and productName != ''">#{productName},</if>
+            <if test="formulaCode != null and formulaCode != ''">#{formulaCode},</if>
+            <if test="formulaName != null and formulaName != ''">#{formulaName},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBsFormulaInfo" parameterType="BsFormulaInfo">
+        update bs_formula_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="productCode != null and productCode != ''">product_code = #{productCode},</if>
+            <if test="productName != null and productName != ''">product_name = #{productName},</if>
+            <if test="formulaCode != null and formulaCode != ''">formula_code = #{formulaCode},</if>
+            <if test="formulaName != null and formulaName != ''">formula_name = #{formulaName},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteBsFormulaInfoById" parameterType="Long">
+        update bs_formula_info set del_flag = "1" where id = #{id}
+    </update>
+
+    <update id="deleteBsFormulaInfoByIds" parameterType="String">
+        update bs_formula_info set del_flag = "1" where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/billion-ui/package.json b/billion-ui/package.json
index b4fba19..279889e 100644
--- a/billion-ui/package.json
+++ b/billion-ui/package.json
@@ -41,6 +41,7 @@
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
     "echarts": "5.4.0",
+    "electron": "^33.2.0",
     "element-ui": "2.15.14",
     "file-saver": "2.0.5",
     "fuse.js": "6.4.3",
diff --git a/billion-ui/src/api/main/bs/formulaChildinfo.js b/billion-ui/src/api/main/bs/formulaChildinfo.js
new file mode 100644
index 0000000..9102e81
--- /dev/null
+++ b/billion-ui/src/api/main/bs/formulaChildinfo.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛�
+export function listInfo(query) {
+  return request({
+    url: '/formulaChildInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭缁�
+export function getInfo(id) {
+  return request({
+    url: '/formulaChildInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板閰嶆柟閰嶇疆瀛愪俊鎭�
+export function addInfo(data) {
+  return request({
+    url: '/formulaChildInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼閰嶆柟閰嶇疆瀛愪俊鎭�
+export function updateInfo(data) {
+  return request({
+    url: '/formulaChildInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎閰嶆柟閰嶇疆瀛愪俊鎭�
+export function delInfo(id) {
+  return request({
+    url: '/formulaChildInfo/' + id,
+    method: 'delete'
+  })
+}
diff --git a/billion-ui/src/api/main/bs/formulaInfo.js b/billion-ui/src/api/main/bs/formulaInfo.js
new file mode 100644
index 0000000..764a0b0
--- /dev/null
+++ b/billion-ui/src/api/main/bs/formulaInfo.js
@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 鏌ヨ閰嶆柟閰嶇疆鍒楄〃
+export function listInfo(query) {
+  return request({
+    url: '/formulaInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getOne(query) {
+  return request({
+    url: '/formulaInfo/getOne',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨ閰嶆柟閰嶇疆璇︾粏
+export function getInfo(id) {
+  return request({
+    url: '/formulaInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板閰嶆柟閰嶇疆
+export function addInfo(data) {
+  return request({
+    url: '/formulaInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼閰嶆柟閰嶇疆
+export function updateInfo(data) {
+  return request({
+    url: '/formulaInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎閰嶆柟閰嶇疆
+export function delInfo(id) {
+  return request({
+    url: '/formulaInfo/' + id,
+    method: 'delete'
+  })
+}
diff --git a/billion-ui/src/plugins/download.js b/billion-ui/src/plugins/download.js
index 42acd00..bb85ce1 100644
--- a/billion-ui/src/plugins/download.js
+++ b/billion-ui/src/plugins/download.js
@@ -17,12 +17,12 @@
       responseType: 'blob',
       headers: { 'Authorization': 'Bearer ' + getToken() }
     }).then((res) => {
-      const isBlob = blobValidate(res.data);
+      const isBlob = blobValidate(res.index);
       if (isBlob) {
-        const blob = new Blob([res.data])
+        const blob = new Blob([res.index])
         this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
       } else {
-        this.printErrMsg(res.data);
+        this.printErrMsg(res.index);
       }
     })
   },
@@ -34,12 +34,12 @@
       responseType: 'blob',
       headers: { 'Authorization': 'Bearer ' + getToken() }
     }).then((res) => {
-      const isBlob = blobValidate(res.data);
+      const isBlob = blobValidate(res.index);
       if (isBlob) {
-        const blob = new Blob([res.data])
+        const blob = new Blob([res.index])
         this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
       } else {
-        this.printErrMsg(res.data);
+        this.printErrMsg(res.index);
       }
     })
   },
@@ -52,12 +52,12 @@
       responseType: 'blob',
       headers: { 'Authorization': 'Bearer ' + getToken() }
     }).then((res) => {
-      const isBlob = blobValidate(res.data);
+      const isBlob = blobValidate(res.index);
       if (isBlob) {
-        const blob = new Blob([res.data], { type: 'application/zip' })
+        const blob = new Blob([res.index], { type: 'application/zip' })
         this.saveAs(blob, name)
       } else {
-        this.printErrMsg(res.data);
+        this.printErrMsg(res.index);
       }
       downloadLoadingInstance.close();
     }).catch((r) => {
diff --git a/billion-ui/src/router/index.js b/billion-ui/src/router/index.js
index 1849928..1222d21 100644
--- a/billion-ui/src/router/index.js
+++ b/billion-ui/src/router/index.js
@@ -135,6 +135,20 @@
     ]
   },
   {
+    path: '/main/formula-data',
+    component: Layout,
+    hidden: true,
+    permissions: ['bs:formulaInfo:list'],
+    children: [
+      {
+        path: 'index',
+        component: () => import('@/views/main/bs/formulaInfoChild/index'),
+        name: 'Data',
+        meta: { title: '宸ヨ壓閰嶆柟璇︽儏', activeMenu: '/main/bs/formulaInfoChild' }
+      }
+    ]
+  },
+  {
     path: '/main/route-data',
     component: Layout,
     hidden: true,
@@ -205,7 +219,7 @@
 }
 
 export default new Router({
-  mode: 'history', // 鍘绘帀url涓殑#
+  mode: 'hash', // 鍘绘帀url涓殑#
   scrollBehavior: () => ({ y: 0 }),
   routes: constantRoutes
 })
diff --git a/billion-ui/src/utils/auth.js b/billion-ui/src/utils/auth.js
index 08a43d6..f15d648 100644
--- a/billion-ui/src/utils/auth.js
+++ b/billion-ui/src/utils/auth.js
@@ -3,13 +3,13 @@
 const TokenKey = 'Admin-Token'
 
 export function getToken() {
-  return Cookies.get(TokenKey)
+  return localStorage.getItem(TokenKey)
 }
 
 export function setToken(token) {
-  return Cookies.set(TokenKey, token)
+  return localStorage.setItem(TokenKey, token)
 }
 
 export function removeToken() {
-  return Cookies.remove(TokenKey)
+  return localStorage.removeItem(TokenKey)
 }
diff --git a/billion-ui/src/utils/request.js b/billion-ui/src/utils/request.js
index ffb0d21..afe98c1 100644
--- a/billion-ui/src/utils/request.js
+++ b/billion-ui/src/utils/request.js
@@ -15,7 +15,7 @@
 // 鍒涘缓axios瀹炰緥
 const service = axios.create({
   // axios涓姹傞厤缃湁baseURL閫夐」锛岃〃绀鸿姹俇RL鍏叡閮ㄥ垎
-  baseURL: process.env.VUE_APP_BASE_API,
+  baseURL: `http://192.168.20.9:8080`,
   // 瓒呮椂
   timeout: 10000
 })
@@ -53,7 +53,7 @@
       cache.session.setJSON('sessionObj', requestObj)
     } else {
       const s_url = sessionObj.url;                  // 璇锋眰鍦板潃
-      const s_data = sessionObj.data;                // 璇锋眰鏁版嵁
+      const s_data = sessionObj.index;                // 璇锋眰鏁版嵁
       const s_time = sessionObj.time;                // 璇锋眰鏃堕棿
       const interval = 1000;                         // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
diff --git a/billion-ui/src/views/main/bs/formulaInfo/index.vue b/billion-ui/src/views/main/bs/formulaInfo/index.vue
new file mode 100644
index 0000000..864fa91
--- /dev/null
+++ b/billion-ui/src/views/main/bs/formulaInfo/index.vue
@@ -0,0 +1,335 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="浜у搧缂栫爜" prop="productCode">
+        <el-input
+          v-model="queryParams.productCode"
+          placeholder="璇疯緭鍏ヤ骇鍝佺紪鐮�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="浜у搧鍚嶇О" prop="productName">
+        <el-input
+          v-model="queryParams.productName"
+          placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="閰嶆柟缂栫爜" prop="formulaCode">
+        <el-input
+          v-model="queryParams.formulaCode"
+          placeholder="璇疯緭鍏ラ厤鏂圭紪鐮�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="閰嶆柟鍚嶇О" prop="formulaName">
+        <el-input
+          v-model="queryParams.formulaName"
+          placeholder="璇疯緭鍏ラ厤鏂瑰悕绉�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="status">
+        <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable>
+          <el-option
+            v-for="dict in dict.type.open_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item style="float: right">
+        <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="['main:info: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="['main:info: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="['main:info: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="['main:info:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column show-overflow-tooltip label="浜у搧缂栫爜" align="center" prop="productCode" />
+      <el-table-column show-overflow-tooltip label="浜у搧鍚嶇О" align="center" prop="productName" />
+      <el-table-column show-overflow-tooltip label="閰嶆柟缂栫爜" align="center" prop="formulaCode" >
+        <template slot-scope="scope">
+          <router-link :to="{path: '/main/formula-data/index/', query: {formulaCode: scope.row.formulaCode} }" class="link-type">
+            <span>{{ scope.row.formulaCode }}</span>
+          </router-link>
+        </template>
+      </el-table-column>
+      <el-table-column show-overflow-tooltip label="閰嶆柟鍚嶇О" align="center" prop="formulaName" />
+      <el-table-column label="鐘舵��" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.open_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="澶囨敞" width="180px" show-overflow-tooltip align="center" prop="remark" />
+      <el-table-column show-overflow-tooltip label="鏇存柊鐢ㄦ埛" align="center" prop="updateBy" />
+      <el-table-column label="鏇存柊鏃堕棿" align="center" prop="updateTime" width="180">
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀归厤鏂归厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="浜у搧缂栫爜" prop="productCode">
+          <el-input v-model="form.productCode" placeholder="璇疯緭鍏ヤ骇鍝佺紪鐮�" />
+        </el-form-item>
+        <el-form-item label="浜у搧鍚嶇О" prop="productName">
+          <el-input v-model="form.productName" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�" />
+        </el-form-item>
+        <el-form-item label="閰嶆柟缂栫爜" prop="formulaCode">
+          <el-input v-model="form.formulaCode" placeholder="璇疯緭鍏ラ厤鏂圭紪鐮�" />
+        </el-form-item>
+        <el-form-item label="閰嶆柟鍚嶇О" prop="formulaName">
+          <el-input v-model="form.formulaName" placeholder="璇疯緭鍏ラ厤鏂瑰悕绉�" />
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.open_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            type="textarea"
+            placeholder="璇疯緭鍏ュ娉�"
+            v-model="form.remark"
+            maxlength="30"
+            show-word-limit
+          >
+          </el-input>
+        </el-form-item>
+      </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 { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/main/bs/formulaInfo";
+
+export default {
+  name: "Info",
+  dicts: ['open_status'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 閰嶆柟閰嶇疆琛ㄦ牸鏁版嵁
+      infoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        productCode: null,
+        productName: null,
+        formulaCode: null,
+        formulaName: null,
+        status: null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        productCode: [
+          { required: true, message: "浜у搧缂栫爜涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        productName: [
+          { required: true, message: "浜у搧鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        formulaCode: [
+          { required: true, message: "閰嶆柟缂栫爜涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        formulaName: [
+          { required: true, message: "閰嶆柟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "change" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ閰嶆柟閰嶇疆鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        productCode: null,
+        productName: null,
+        formulaCode: null,
+        formulaName: null,
+        status: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞閰嶆柟閰嶇疆";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼閰嶆柟閰嶇疆";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('formulaInfo/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/billion-ui/src/views/main/bs/formulaInfoChild/index.vue b/billion-ui/src/views/main/bs/formulaInfoChild/index.vue
new file mode 100644
index 0000000..c101494
--- /dev/null
+++ b/billion-ui/src/views/main/bs/formulaInfoChild/index.vue
@@ -0,0 +1,404 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="浜х嚎缂栧彿" prop="lineCode">
+        <el-input
+          v-model="queryParams.lineCode"
+          placeholder="璇疯緭鍏ヤ骇绾跨紪鍙�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="宸ヤ綅缂栧彿" prop="locationCode">
+        <el-input
+          v-model="queryParams.locationCode"
+          placeholder="璇疯緭鍏ュ伐浣嶇紪鍙�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鎿嶄綔绫诲瀷" prop="operationType">
+        <el-select v-model="queryParams.operationType" placeholder="璇烽�夋嫨鎿嶄綔绫诲瀷" clearable>
+          <el-option
+            v-for="dict in dict.type.operation_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍙傛暟缂栫爜" prop="paramCode">
+        <el-input
+          v-model="queryParams.paramCode"
+          placeholder="璇疯緭鍏ュ弬鏁扮紪鐮�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item style="float: right">
+        <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 style="width: 600px">
+      <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="['main:info: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="['main:info: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="['main:info: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="['main:info:export']"
+          >瀵煎嚭</el-button>
+        </el-col>
+      </el-row>
+    </div>
+
+    <el-descriptions class="margin-top" :column="3" :size="size" border>
+      <el-descriptions-item>
+        <template slot="label">
+          <i class="el-icon-user"></i>
+          閰嶆柟缂栫爜
+        </template>
+        {{queryParams.formulaCode}}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label">
+          <i class="el-icon-mobile-phone"></i>
+          閰嶆柟鍚嶇О
+        </template>
+        {{showData.formulaName}}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label">
+          <i class="el-icon-location-outline"></i>
+          浜у搧缂栧彿
+        </template>
+        {{showData.productCode}}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label">
+          <i class="el-icon-tickets"></i>
+          浜у搧鍚嶇О
+        </template>
+        {{showData.productName}}
+      </el-descriptions-item>
+    </el-descriptions>
+    <el-table border v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column show-overflow-tooltip label="閰嶆柟缂栫爜" align="center" prop="formulaCode" />
+      <el-table-column show-overflow-tooltip label="浜х嚎缂栧彿" align="center" prop="lineCode" />
+      <el-table-column show-overflow-tooltip label="宸ヤ綅缂栧彿" align="center" prop="locationCode" />
+      <el-table-column show-overflow-tooltip label="浜у搧缂栧彿" align="center" prop="productCode" />
+      <el-table-column show-overflow-tooltip label="鎿嶄綔鍐呭" align="center" prop="operationContent" />
+      <el-table-column label="鎿嶄綔绫诲瀷" align="center" prop="operationType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.operation_type" :value="scope.row.operationType"/>
+        </template>
+      </el-table-column>
+      <el-table-column show-overflow-tooltip label="鎺掑簭" align="center" prop="stepSort" />
+      <el-table-column show-overflow-tooltip label="鍙傛暟缂栫爜" align="center" prop="paramCode" />
+      <el-table-column label="鍥剧墖" align="center" prop="picture" width="100">
+        <template slot-scope="scope">
+          <image-preview :src="scope.row.picture" :width="50" :height="50"/>
+        </template>
+      </el-table-column>
+      <el-table-column show-overflow-tooltip label="澶囨敞" align="center" prop="remarks" />
+
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀归厤鏂归厤缃瓙淇℃伅瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="閰嶆柟缂栫爜" prop="formulaCode">
+          <el-input v-model="form.formulaCode" placeholder="璇疯緭鍏ラ厤鏂圭紪鐮�" disabled />
+        </el-form-item>
+        <el-form-item label="浜у搧缂栧彿" prop="productCode">
+          <el-input v-model="form.productCode" placeholder="璇疯緭鍏ヤ骇鍝佺紪鍙�" disabled/>
+        </el-form-item>
+        <el-form-item label="浜х嚎缂栧彿" prop="lineCode">
+          <el-input v-model="form.lineCode" placeholder="璇疯緭鍏ヤ骇绾跨紪鍙�" />
+        </el-form-item>
+        <el-form-item label="宸ヤ綅缂栧彿" prop="locationCode">
+          <el-input v-model="form.locationCode" placeholder="璇疯緭鍏ュ伐浣嶇紪鍙�" />
+        </el-form-item>
+
+        <el-form-item label="鎿嶄綔鍐呭">
+          <editor v-model="form.operationContent" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="鎿嶄綔绫诲瀷" prop="operationType">
+          <el-select v-model="form.operationType" placeholder="璇烽�夋嫨鎿嶄綔绫诲瀷">
+            <el-option
+              v-for="dict in dict.type.operation_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎺掑簭" prop="stepSort">
+          <el-input v-model="form.stepSort" placeholder="璇疯緭鍏ユ帓搴�" />
+        </el-form-item>
+        <el-form-item label="鍙傛暟缂栫爜" prop="paramCode">
+          <el-input v-model="form.paramCode" placeholder="璇疯緭鍏ュ弬鏁扮紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍥剧墖" prop="picture">
+          <image-upload v-model="form.picture"/>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remarks">
+          <el-input v-model="form.remarks" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"
+                    maxlength="30"
+                    show-word-limit />
+        </el-form-item>
+
+      </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 {addInfo, delInfo, getInfo, listInfo, updateInfo} from "@/api/main/bs/formulaChildinfo";
+import { getOne } from '@/api/main/bs/formulaInfo'
+
+export default {
+  name: "formulaInfoChild",
+  dicts: ['operation_type'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 閰嶆柟閰嶇疆瀛愪俊鎭〃鏍兼暟鎹�
+      infoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        lineCode: null,
+        locationCode: null,
+        productCode: null,
+        operationType: null,
+        stepSort: null,
+        paramCode: null,
+        formulaCode: null,
+      },
+      showData: {
+        formulaCode: null,
+        productCode: null,
+        productName: null,
+        formulaName: null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        lineCode: [
+          { required: true, message: "浜х嚎缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        locationCode: [
+          { required: true, message: "宸ヤ綅缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        productCode: [
+          { required: true, message: "浜у搧缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        operationContent: [
+          { required: true, message: "鎿嶄綔鍐呭涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        operationType: [
+          { required: true, message: "鎿嶄綔绫诲瀷涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        stepSort: [
+          { required: true, message: "鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        paramCode: [
+          { required: true, message: "鍙傛暟缂栫爜涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.queryParams.formulaCode = this.$route.query.formulaCode
+    this.getOne()
+    console.log('this.queryParams.formulaCode',this.queryParams.formulaCode)
+    this.getList();
+  },
+  methods: {
+    getOne(){
+      getOne({formulaCode: this.queryParams.formulaCode}).then(res => {
+        if (res.code === 200){
+          this.showData.productCode = res.data.productCode
+          this.showData.productName = res.data.productName
+          this.showData.formulaName = res.data.formulaName
+        }
+      })
+    },
+    /** 鏌ヨ閰嶆柟閰嶇疆瀛愪俊鎭垪琛� */
+    getList() {
+      this.loading = true;
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        lineCode: null,
+        locationCode: null,
+        productCode: null,
+        operationContent: null,
+        operationType: null,
+        stepSort: null,
+        paramCode: null,
+        picture: null,
+        remarks: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        collectData: null,
+        results: null,
+        formulaCode: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.form.productCode = this.showData.productCode
+      this.form.formulaCode = this.queryParams.formulaCode
+      this.open = true;
+      this.title = "娣诲姞閰嶆柟閰嶇疆瀛愪俊鎭�";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼閰嶆柟閰嶇疆瀛愪俊鎭�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('formulaChildInfo/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/billion-ui/src/views/main/om/info/index.vue b/billion-ui/src/views/main/om/info/index.vue
index 415f7fc..567066b 100644
--- a/billion-ui/src/views/main/om/info/index.vue
+++ b/billion-ui/src/views/main/om/info/index.vue
@@ -147,24 +147,6 @@
       </el-table-column>
       <el-table-column label="鏇存柊鐢ㄦ埛" align="center" prop="updateBy" />
       <el-table-column label="澶囨敞" width="180px" show-overflow-tooltip align="center" prop="remarks" />
-<!--      <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="['main:info:edit']"-->
-<!--          >淇敼</el-button>-->
-<!--          <el-button-->
-<!--            size="mini"-->
-<!--            type="text"-->
-<!--            icon="el-icon-delete"-->
-<!--            @click="handleDelete(scope.row)"-->
-<!--            v-hasPermi="['main:info:remove']"-->
-<!--          >鍒犻櫎</el-button>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
     </el-table>
 
     <pagination
diff --git a/billion-ui/src/views/tool/build/RightPanel.vue b/billion-ui/src/views/tool/build/RightPanel.vue
index c2760eb..9fae306 100644
--- a/billion-ui/src/views/tool/build/RightPanel.vue
+++ b/billion-ui/src/views/tool/build/RightPanel.vue
@@ -771,7 +771,7 @@
     },
     remove(node, data) {
       const { parent } = node
-      const children = parent.data.children || parent.data
+      const children = parent.index.children || parent.index
       const index = children.findIndex(d => d.id === data.id)
       children.splice(index, 1)
     },
diff --git a/billion-ui/vue.config.js b/billion-ui/vue.config.js
index 2f331d6..e01fb44 100644
--- a/billion-ui/vue.config.js
+++ b/billion-ui/vue.config.js
@@ -18,7 +18,8 @@
   // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
   // 榛樿鎯呭喌涓嬶紝Vue CLI 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂
   // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
-  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  // publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  publicPath: "./",
   // 鍦╪pm run build 鎴� yarn build 鏃� 锛岀敓鎴愭枃浠剁殑鐩綍鍚嶇О锛堣鍜宐aseUrl鐨勭敓浜х幆澧冭矾寰勪竴鑷达級锛堥粯璁ist锛�
   outputDir: 'dist',
   // 鐢ㄤ簬鏀剧疆鐢熸垚鐨勯潤鎬佽祫婧� (js銆乧ss銆乮mg銆乫onts) 鐨勶紱锛堥」鐩墦鍖呬箣鍚庯紝闈欐�佽祫婧愪細鏀惧湪杩欎釜鏂囦欢澶逛笅锛�
@@ -26,7 +27,7 @@
   // 鏄惁寮�鍚痚slint淇濆瓨妫�娴嬶紝鏈夋晥鍊硷細ture | false | 'error'
   lintOnSave: process.env.NODE_ENV === 'development',
   // 濡傛灉浣犱笉闇�瑕佺敓浜х幆澧冪殑 source map锛屽彲浠ュ皢鍏惰缃负 false 浠ュ姞閫熺敓浜х幆澧冩瀯寤恒��
-  productionSourceMap: false,
+  productionSourceMap: true,
   transpileDependencies: ['quill'],
   // webpack-dev-server 鐩稿叧閰嶇疆
   devServer: {
@@ -36,7 +37,7 @@
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://localhost:8080`,
+        target: `http://192.168.20.9:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''

--
Gitblit v1.9.3