From dea0a32cf795a33bf4e4cbdb8a3cbae2897ba698 Mon Sep 17 00:00:00 2001
From: admin <15939171744@163.com>
Date: 星期二, 26 十一月 2024 14:33:28 +0800
Subject: [PATCH] -物料信息 工位信息

---
 billion-main/src/main/java/com/billion/main/bs/domain/BsMaterialInfo.java                  |   71 ++
 billion-main/src/main/java/com/billion/main/bs/mapper/BsMaterialInfoMapper.java            |   63 +
 billion-main/src/main/java/com/billion/main/bs/controller/BsMaterialInfoController.java    |  104 +++
 billion-ui/src/api/main/bs/locationInfo.js                                                 |   44 +
 billion-ui/src/views/main/bs/routeInfo/ProductSelector.vue                                 |   58 +
 billion-main/src/main/java/com/billion/main/bs/domain/BsLocationInfo.java                  |   47 +
 billion-main/src/main/resources/mapper/bs/BsMaterialInfoMapper.xml                         |  124 +++
 billion-ui/src/views/main/bs/locationInfo/index.vue                                        |  300 +++++++++
 billion-ui/src/api/main/bs/materialInfo.js                                                 |   44 +
 billion-main/src/main/java/com/billion/main/bs/service/impl/BsMaterialInfoServiceImpl.java |   98 +++
 billion-main/src/main/resources/mapper/bs/BsLocationInfoMapper.xml                         |   97 +++
 billion-main/src/main/java/com/billion/main/bs/service/IBsMaterialInfoService.java         |   63 +
 billion-generator/src/main/resources/vm/vue/index.vue.vm                                   |    2 
 billion-ui/src/views/main/bs/routeInfo/index.vue                                           |   57 +
 billion-main/src/main/java/com/billion/main/bs/service/IBsLocationInfoService.java         |   63 +
 billion-main/src/main/java/com/billion/main/bs/controller/BsLocationInfoController.java    |  104 +++
 billion-main/src/main/java/com/billion/main/bs/mapper/BsLocationInfoMapper.java            |   63 +
 billion-main/src/main/java/com/billion/main/bs/service/impl/BsLocationInfoServiceImpl.java |   98 +++
 billion-ui/src/views/main/bs/materialInfo/index.vue                                        |  410 ++++++++++++
 19 files changed, 1,899 insertions(+), 11 deletions(-)

diff --git a/billion-generator/src/main/resources/vm/vue/index.vue.vm b/billion-generator/src/main/resources/vm/vue/index.vue.vm
index 002940f..e08822f 100644
--- a/billion-generator/src/main/resources/vm/vue/index.vue.vm
+++ b/billion-generator/src/main/resources/vm/vue/index.vue.vm
@@ -145,7 +145,7 @@
         </template>
       </el-table-column>
 #elseif($column.list && "" != $javaField)
-      <el-table-column show-overflow-tooltip="true" label="${comment}" align="center" prop="${javaField}" />
+      <el-table-column :show-overflow-tooltip="true" label="${comment}" align="center" prop="${javaField}" />
 #end
 #end
 ##      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
diff --git a/billion-main/src/main/java/com/billion/main/bs/controller/BsLocationInfoController.java b/billion-main/src/main/java/com/billion/main/bs/controller/BsLocationInfoController.java
new file mode 100644
index 0000000..1c143bc
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/controller/BsLocationInfoController.java
@@ -0,0 +1,104 @@
+package com.billion.main.bs.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.main.bs.domain.BsLocationInfo;
+import com.billion.main.bs.service.IBsLocationInfoService;
+import com.billion.common.utils.poi.ExcelUtil;
+import com.billion.common.core.page.TableDataInfo;
+
+/**
+ * 宸ヤ綅淇℃伅Controller
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@RestController
+@RequestMapping("/bs/locationInfo")
+public class BsLocationInfoController extends BaseController
+{
+    @Autowired
+    private IBsLocationInfoService bsLocationInfoService;
+
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BsLocationInfo bsLocationInfo)
+    {
+        startPage();
+        List<BsLocationInfo> list = bsLocationInfoService.selectBsLocationInfoList(bsLocationInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭宸ヤ綅淇℃伅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:export')")
+    @Log(title = "宸ヤ綅淇℃伅", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BsLocationInfo bsLocationInfo)
+    {
+        List<BsLocationInfo> list = bsLocationInfoService.selectBsLocationInfoList(bsLocationInfo);
+        ExcelUtil<BsLocationInfo> util = new ExcelUtil<BsLocationInfo>(BsLocationInfo.class);
+        util.exportExcel(response, list, "宸ヤ綅淇℃伅鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇宸ヤ綅淇℃伅璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(bsLocationInfoService.selectBsLocationInfoById(id));
+    }
+
+    /**
+     * 鏂板宸ヤ綅淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:add')")
+    @Log(title = "宸ヤ綅淇℃伅", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BsLocationInfo bsLocationInfo)
+    {
+        return toAjax(bsLocationInfoService.insertBsLocationInfo(bsLocationInfo));
+    }
+
+    /**
+     * 淇敼宸ヤ綅淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:edit')")
+    @Log(title = "宸ヤ綅淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BsLocationInfo bsLocationInfo)
+    {
+        return toAjax(bsLocationInfoService.updateBsLocationInfo(bsLocationInfo));
+    }
+
+    /**
+     * 鍒犻櫎宸ヤ綅淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:locationInfo:remove')")
+    @Log(title = "宸ヤ綅淇℃伅", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(bsLocationInfoService.deleteBsLocationInfoByIds(ids));
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/controller/BsMaterialInfoController.java b/billion-main/src/main/java/com/billion/main/bs/controller/BsMaterialInfoController.java
new file mode 100644
index 0000000..02bdd59
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/controller/BsMaterialInfoController.java
@@ -0,0 +1,104 @@
+package com.billion.main.bs.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+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.main.bs.domain.BsMaterialInfo;
+import com.billion.main.bs.service.IBsMaterialInfoService;
+import com.billion.common.utils.poi.ExcelUtil;
+import com.billion.common.core.page.TableDataInfo;
+
+/**
+ * 鐗╂枡淇℃伅Controller
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@RestController
+@RequestMapping("/bs/materialInfo")
+public class BsMaterialInfoController extends BaseController
+{
+    @Autowired
+    private IBsMaterialInfoService bsMaterialInfoService;
+
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BsMaterialInfo bsMaterialInfo)
+    {
+        startPage();
+        List<BsMaterialInfo> list = bsMaterialInfoService.selectBsMaterialInfoList(bsMaterialInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鐗╂枡淇℃伅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:export')")
+    @Log(title = "鐗╂枡淇℃伅", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BsMaterialInfo bsMaterialInfo)
+    {
+        List<BsMaterialInfo> list = bsMaterialInfoService.selectBsMaterialInfoList(bsMaterialInfo);
+        ExcelUtil<BsMaterialInfo> util = new ExcelUtil<BsMaterialInfo>(BsMaterialInfo.class);
+        util.exportExcel(response, list, "鐗╂枡淇℃伅鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇鐗╂枡淇℃伅璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(bsMaterialInfoService.selectBsMaterialInfoById(id));
+    }
+
+    /**
+     * 鏂板鐗╂枡淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:add')")
+    @Log(title = "鐗╂枡淇℃伅", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BsMaterialInfo bsMaterialInfo)
+    {
+        return toAjax(bsMaterialInfoService.insertBsMaterialInfo(bsMaterialInfo));
+    }
+
+    /**
+     * 淇敼鐗╂枡淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:edit')")
+    @Log(title = "鐗╂枡淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BsMaterialInfo bsMaterialInfo)
+    {
+        return toAjax(bsMaterialInfoService.updateBsMaterialInfo(bsMaterialInfo));
+    }
+
+    /**
+     * 鍒犻櫎鐗╂枡淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('bs:materialInfo:remove')")
+    @Log(title = "鐗╂枡淇℃伅", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(bsMaterialInfoService.deleteBsMaterialInfoByIds(ids));
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/domain/BsLocationInfo.java b/billion-main/src/main/java/com/billion/main/bs/domain/BsLocationInfo.java
new file mode 100644
index 0000000..0079381
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/domain/BsLocationInfo.java
@@ -0,0 +1,47 @@
+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_location_info
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@Data
+public class BsLocationInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private Long id;
+
+    /** 宸ヤ綅缂栧彿 */
+    @Excel(name = "宸ヤ綅缂栧彿")
+    private String locationCode;
+
+    /** 宸ヤ綅鍚嶇О */
+    @Excel(name = "宸ヤ綅鍚嶇О")
+    private String locationName;
+
+    /** 宸ヤ綅绫诲瀷锛�1鑷姩2鍗婅嚜鍔�3鎵嬪姩锛� */
+    @Excel(name = "宸ヤ綅绫诲瀷", readConverterExp = "1=鑷姩2鍗婅嚜鍔�3鎵嬪姩")
+    private String locationType;
+
+    /** 浜х嚎缂栧彿 */
+    @Excel(name = "浜х嚎缂栧彿")
+    private String lineCode;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String remarks;
+
+    /** 閫昏緫鍒犻櫎 */
+    private String delFlag;
+
+
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/domain/BsMaterialInfo.java b/billion-main/src/main/java/com/billion/main/bs/domain/BsMaterialInfo.java
new file mode 100644
index 0000000..07adb07
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/domain/BsMaterialInfo.java
@@ -0,0 +1,71 @@
+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_material_info
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@Data
+public class BsMaterialInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private Long id;
+
+    /** 鐗╂枡缂栧彿 */
+    @Excel(name = "鐗╂枡缂栧彿")
+    private String materialCode;
+
+    /** 鐗╂枡鍚嶇О */
+    @Excel(name = "鐗╂枡鍚嶇О")
+    private String materialName;
+
+    /** 瑙嗗浘 */
+    @Excel(name = "瑙嗗浘")
+    private String materialView;
+
+    /** 绉嶇被 */
+    @Excel(name = "绉嶇被")
+    private String typeZ;
+
+    /** 绫诲瀷 */
+    @Excel(name = "绫诲瀷")
+    private String typeL;
+
+    /** 鍗曚綅 */
+    @Excel(name = "鍗曚綅")
+    private String unit;
+
+    /** 鐗堟湰 */
+    @Excel(name = "鐗堟湰")
+    private String version;
+
+    /** 鐘舵�� */
+    @Excel(name = "鐘舵��")
+    private String status;
+
+    /** 鍘傚晢 */
+    @Excel(name = "鍘傚晢")
+    private String supplier;
+
+    /** 鏁版嵁鏉ユ簮 */
+    @Excel(name = "鏁版嵁鏉ユ簮")
+    private String dataSource;
+
+    /** 閫昏緫鍒犻櫎 */
+    private String delFlag;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/mapper/BsLocationInfoMapper.java b/billion-main/src/main/java/com/billion/main/bs/mapper/BsLocationInfoMapper.java
new file mode 100644
index 0000000..f189c91
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/mapper/BsLocationInfoMapper.java
@@ -0,0 +1,63 @@
+package com.billion.main.bs.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.billion.main.bs.domain.BsLocationInfo;
+
+/**
+ * 宸ヤ綅淇℃伅Mapper鎺ュ彛
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+public interface BsLocationInfoMapper extends BaseMapper<BsLocationInfo>
+{
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 宸ヤ綅淇℃伅
+     */
+    public BsLocationInfo selectBsLocationInfoById(Long id);
+
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅鍒楄〃
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 宸ヤ綅淇℃伅闆嗗悎
+     */
+    public List<BsLocationInfo> selectBsLocationInfoList(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 鏂板宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertBsLocationInfo(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 淇敼宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateBsLocationInfo(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 鍒犻櫎宸ヤ綅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsLocationInfoById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎宸ヤ綅淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsLocationInfoByIds(Long[] ids);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/mapper/BsMaterialInfoMapper.java b/billion-main/src/main/java/com/billion/main/bs/mapper/BsMaterialInfoMapper.java
new file mode 100644
index 0000000..349bab3
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/mapper/BsMaterialInfoMapper.java
@@ -0,0 +1,63 @@
+package com.billion.main.bs.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.billion.main.bs.domain.BsMaterialInfo;
+
+/**
+ * 鐗╂枡淇℃伅Mapper鎺ュ彛
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+public interface BsMaterialInfoMapper extends BaseMapper<BsMaterialInfo>
+{
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 鐗╂枡淇℃伅
+     */
+    public BsMaterialInfo selectBsMaterialInfoById(Long id);
+
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅鍒楄〃
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 鐗╂枡淇℃伅闆嗗悎
+     */
+    public List<BsMaterialInfo> selectBsMaterialInfoList(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 鏂板鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertBsMaterialInfo(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 淇敼鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateBsMaterialInfo(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 鍒犻櫎鐗╂枡淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsMaterialInfoById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsMaterialInfoByIds(Long[] ids);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/IBsLocationInfoService.java b/billion-main/src/main/java/com/billion/main/bs/service/IBsLocationInfoService.java
new file mode 100644
index 0000000..88198ef
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/IBsLocationInfoService.java
@@ -0,0 +1,63 @@
+package com.billion.main.bs.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.billion.main.bs.domain.BsLocationInfo;
+
+/**
+ * 宸ヤ綅淇℃伅Service鎺ュ彛
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+public interface IBsLocationInfoService extends IService<BsLocationInfo>
+{
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 宸ヤ綅淇℃伅
+     */
+    public BsLocationInfo selectBsLocationInfoById(Long id);
+
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅鍒楄〃
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 宸ヤ綅淇℃伅闆嗗悎
+     */
+    public List<BsLocationInfo> selectBsLocationInfoList(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 鏂板宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertBsLocationInfo(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 淇敼宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateBsLocationInfo(BsLocationInfo bsLocationInfo);
+
+    /**
+     * 鎵归噺鍒犻櫎宸ヤ綅淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑宸ヤ綅淇℃伅涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsLocationInfoByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎宸ヤ綅淇℃伅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsLocationInfoById(Long id);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/IBsMaterialInfoService.java b/billion-main/src/main/java/com/billion/main/bs/service/IBsMaterialInfoService.java
new file mode 100644
index 0000000..5779382
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/IBsMaterialInfoService.java
@@ -0,0 +1,63 @@
+package com.billion.main.bs.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.billion.main.bs.domain.BsMaterialInfo;
+
+/**
+ * 鐗╂枡淇℃伅Service鎺ュ彛
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+public interface IBsMaterialInfoService extends IService<BsMaterialInfo>
+{
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 鐗╂枡淇℃伅
+     */
+    public BsMaterialInfo selectBsMaterialInfoById(Long id);
+
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅鍒楄〃
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 鐗╂枡淇℃伅闆嗗悎
+     */
+    public List<BsMaterialInfo> selectBsMaterialInfoList(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 鏂板鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertBsMaterialInfo(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 淇敼鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateBsMaterialInfo(BsMaterialInfo bsMaterialInfo);
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐗╂枡淇℃伅涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteBsMaterialInfoByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎鐗╂枡淇℃伅淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteBsMaterialInfoById(Long id);
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/impl/BsLocationInfoServiceImpl.java b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsLocationInfoServiceImpl.java
new file mode 100644
index 0000000..2f04417
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsLocationInfoServiceImpl.java
@@ -0,0 +1,98 @@
+package com.billion.main.bs.service.impl;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.billion.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.billion.main.bs.mapper.BsLocationInfoMapper;
+import com.billion.main.bs.domain.BsLocationInfo;
+import com.billion.main.bs.service.IBsLocationInfoService;
+
+/**
+ * 宸ヤ綅淇℃伅Service涓氬姟灞傚鐞�
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@Service
+public class BsLocationInfoServiceImpl extends ServiceImpl<BsLocationInfoMapper, BsLocationInfo> implements IBsLocationInfoService
+{
+    @Autowired
+    private BsLocationInfoMapper bsLocationInfoMapper;
+
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 宸ヤ綅淇℃伅
+     */
+    @Override
+    public BsLocationInfo selectBsLocationInfoById(Long id)
+    {
+        return bsLocationInfoMapper.selectBsLocationInfoById(id);
+    }
+
+    /**
+     * 鏌ヨ宸ヤ綅淇℃伅鍒楄〃
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 宸ヤ綅淇℃伅
+     */
+    @Override
+    public List<BsLocationInfo> selectBsLocationInfoList(BsLocationInfo bsLocationInfo)
+    {
+        return bsLocationInfoMapper.selectBsLocationInfoList(bsLocationInfo);
+    }
+
+    /**
+     * 鏂板宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertBsLocationInfo(BsLocationInfo bsLocationInfo)
+    {
+        bsLocationInfo.setCreateTime(DateUtils.getNowDate());
+        return bsLocationInfoMapper.insertBsLocationInfo(bsLocationInfo);
+    }
+
+    /**
+     * 淇敼宸ヤ綅淇℃伅
+     * 
+     * @param bsLocationInfo 宸ヤ綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateBsLocationInfo(BsLocationInfo bsLocationInfo)
+    {
+        bsLocationInfo.setUpdateTime(DateUtils.getNowDate());
+        return bsLocationInfoMapper.updateBsLocationInfo(bsLocationInfo);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎宸ヤ綅淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑宸ヤ綅淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsLocationInfoByIds(Long[] ids)
+    {
+        return bsLocationInfoMapper.deleteBsLocationInfoByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎宸ヤ綅淇℃伅淇℃伅
+     * 
+     * @param id 宸ヤ綅淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsLocationInfoById(Long id)
+    {
+        return bsLocationInfoMapper.deleteBsLocationInfoById(id);
+    }
+}
diff --git a/billion-main/src/main/java/com/billion/main/bs/service/impl/BsMaterialInfoServiceImpl.java b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsMaterialInfoServiceImpl.java
new file mode 100644
index 0000000..63c0452
--- /dev/null
+++ b/billion-main/src/main/java/com/billion/main/bs/service/impl/BsMaterialInfoServiceImpl.java
@@ -0,0 +1,98 @@
+package com.billion.main.bs.service.impl;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.billion.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.billion.main.bs.mapper.BsMaterialInfoMapper;
+import com.billion.main.bs.domain.BsMaterialInfo;
+import com.billion.main.bs.service.IBsMaterialInfoService;
+
+/**
+ * 鐗╂枡淇℃伅Service涓氬姟灞傚鐞�
+ * 
+ * @author Billion-Yi
+ * @date 2024-11-26
+ */
+@Service
+public class BsMaterialInfoServiceImpl extends ServiceImpl<BsMaterialInfoMapper, BsMaterialInfo> implements IBsMaterialInfoService
+{
+    @Autowired
+    private BsMaterialInfoMapper bsMaterialInfoMapper;
+
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 鐗╂枡淇℃伅
+     */
+    @Override
+    public BsMaterialInfo selectBsMaterialInfoById(Long id)
+    {
+        return bsMaterialInfoMapper.selectBsMaterialInfoById(id);
+    }
+
+    /**
+     * 鏌ヨ鐗╂枡淇℃伅鍒楄〃
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 鐗╂枡淇℃伅
+     */
+    @Override
+    public List<BsMaterialInfo> selectBsMaterialInfoList(BsMaterialInfo bsMaterialInfo)
+    {
+        return bsMaterialInfoMapper.selectBsMaterialInfoList(bsMaterialInfo);
+    }
+
+    /**
+     * 鏂板鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertBsMaterialInfo(BsMaterialInfo bsMaterialInfo)
+    {
+        bsMaterialInfo.setCreateTime(DateUtils.getNowDate());
+        return bsMaterialInfoMapper.insertBsMaterialInfo(bsMaterialInfo);
+    }
+
+    /**
+     * 淇敼鐗╂枡淇℃伅
+     * 
+     * @param bsMaterialInfo 鐗╂枡淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateBsMaterialInfo(BsMaterialInfo bsMaterialInfo)
+    {
+        bsMaterialInfo.setUpdateTime(DateUtils.getNowDate());
+        return bsMaterialInfoMapper.updateBsMaterialInfo(bsMaterialInfo);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐗╂枡淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsMaterialInfoByIds(Long[] ids)
+    {
+        return bsMaterialInfoMapper.deleteBsMaterialInfoByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鐗╂枡淇℃伅淇℃伅
+     * 
+     * @param id 鐗╂枡淇℃伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBsMaterialInfoById(Long id)
+    {
+        return bsMaterialInfoMapper.deleteBsMaterialInfoById(id);
+    }
+}
diff --git a/billion-main/src/main/resources/mapper/bs/BsLocationInfoMapper.xml b/billion-main/src/main/resources/mapper/bs/BsLocationInfoMapper.xml
new file mode 100644
index 0000000..403be8b
--- /dev/null
+++ b/billion-main/src/main/resources/mapper/bs/BsLocationInfoMapper.xml
@@ -0,0 +1,97 @@
+<?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.BsLocationInfoMapper">
+    
+    <resultMap type="BsLocationInfo" id="BsLocationInfoResult">
+        <result property="id"    column="id"    />
+        <result property="locationCode"    column="location_code"    />
+        <result property="locationName"    column="location_name"    />
+        <result property="locationType"    column="location_type"    />
+        <result property="lineCode"    column="line_code"    />
+        <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="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectBsLocationInfoVo">
+        select id, location_code, location_name, location_type, line_code, remarks, create_by, create_time, update_by, update_time, del_flag from bs_location_info
+    </sql>
+
+    <select id="selectBsLocationInfoList" parameterType="BsLocationInfo" resultMap="BsLocationInfoResult">
+        <include refid="selectBsLocationInfoVo"/>
+        <where>  
+            <if test="locationCode != null  and locationCode != ''"> and location_code like concat('%', #{locationCode}, '%')</if>
+            <if test="locationName != null  and locationName != ''"> and location_name like concat('%', #{locationName}, '%')</if>
+            <if test="locationType != null  and locationType != ''"> and location_type = #{locationType}</if>
+            <if test="lineCode != null  and lineCode != ''"> and line_code like concat('%', #{lineCode}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectBsLocationInfoById" parameterType="Long" resultMap="BsLocationInfoResult">
+        <include refid="selectBsLocationInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBsLocationInfo" parameterType="BsLocationInfo">
+        insert into bs_location_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="locationCode != null">location_code,</if>
+            <if test="locationName != null">location_name,</if>
+            <if test="locationType != null">location_type,</if>
+            <if test="lineCode != null">line_code,</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="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="locationCode != null">#{locationCode},</if>
+            <if test="locationName != null">#{locationName},</if>
+            <if test="locationType != null">#{locationType},</if>
+            <if test="lineCode != null">#{lineCode},</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="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBsLocationInfo" parameterType="BsLocationInfo">
+        update bs_location_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="locationCode != null">location_code = #{locationCode},</if>
+            <if test="locationName != null">location_name = #{locationName},</if>
+            <if test="locationType != null">location_type = #{locationType},</if>
+            <if test="lineCode != null">line_code = #{lineCode},</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="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBsLocationInfoById" parameterType="Long">
+        delete from bs_location_info where id = #{id}
+    </delete>
+
+    <delete id="deleteBsLocationInfoByIds" parameterType="String">
+        delete from bs_location_info where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/billion-main/src/main/resources/mapper/bs/BsMaterialInfoMapper.xml b/billion-main/src/main/resources/mapper/bs/BsMaterialInfoMapper.xml
new file mode 100644
index 0000000..3883699
--- /dev/null
+++ b/billion-main/src/main/resources/mapper/bs/BsMaterialInfoMapper.xml
@@ -0,0 +1,124 @@
+<?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.BsMaterialInfoMapper">
+    
+    <resultMap type="BsMaterialInfo" id="BsMaterialInfoResult">
+        <result property="id"    column="id"    />
+        <result property="materialCode"    column="material_code"    />
+        <result property="materialName"    column="material_name"    />
+        <result property="materialView"    column="material_view"    />
+        <result property="typeZ"    column="type_z"    />
+        <result property="typeL"    column="type_l"    />
+        <result property="unit"    column="unit"    />
+        <result property="version"    column="version"    />
+        <result property="status"    column="status"    />
+        <result property="supplier"    column="supplier"    />
+        <result property="remark"    column="remark"    />
+        <result property="dataSource"    column="data_source"    />
+        <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="selectBsMaterialInfoVo">
+        select id, material_code, material_name, material_view, type_z, type_l, unit, version, status, supplier, remark, data_source, create_by, create_time, update_by, update_time, del_flag from bs_material_info
+    </sql>
+
+    <select id="selectBsMaterialInfoList" parameterType="BsMaterialInfo" resultMap="BsMaterialInfoResult">
+        <include refid="selectBsMaterialInfoVo"/>
+        <where>  
+            <if test="materialCode != null  and materialCode != ''"> and material_code like concat('%', #{materialCode}, '%')</if>
+            <if test="materialName != null  and materialName != ''"> and material_name like concat('%', #{materialName}, '%')</if>
+            <if test="materialView != null  and materialView != ''"> and material_view = #{materialView}</if>
+            <if test="typeZ != null  and typeZ != ''"> and type_z = #{typeZ}</if>
+            <if test="typeL != null  and typeL != ''"> and type_l = #{typeL}</if>
+            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectBsMaterialInfoById" parameterType="Long" resultMap="BsMaterialInfoResult">
+        <include refid="selectBsMaterialInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBsMaterialInfo" parameterType="BsMaterialInfo">
+        insert into bs_material_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="materialCode != null and materialCode != ''">material_code,</if>
+            <if test="materialName != null and materialName != ''">material_name,</if>
+            <if test="materialView != null">material_view,</if>
+            <if test="typeZ != null">type_z,</if>
+            <if test="typeL != null">type_l,</if>
+            <if test="unit != null">unit,</if>
+            <if test="version != null">version,</if>
+            <if test="status != null">status,</if>
+            <if test="supplier != null">supplier,</if>
+            <if test="remark != null">remark,</if>
+            <if test="dataSource != null">data_source,</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="materialCode != null and materialCode != ''">#{materialCode},</if>
+            <if test="materialName != null and materialName != ''">#{materialName},</if>
+            <if test="materialView != null">#{materialView},</if>
+            <if test="typeZ != null">#{typeZ},</if>
+            <if test="typeL != null">#{typeL},</if>
+            <if test="unit != null">#{unit},</if>
+            <if test="version != null">#{version},</if>
+            <if test="status != null">#{status},</if>
+            <if test="supplier != null">#{supplier},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="dataSource != null">#{dataSource},</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="updateBsMaterialInfo" parameterType="BsMaterialInfo">
+        update bs_material_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="materialCode != null and materialCode != ''">material_code = #{materialCode},</if>
+            <if test="materialName != null and materialName != ''">material_name = #{materialName},</if>
+            <if test="materialView != null">material_view = #{materialView},</if>
+            <if test="typeZ != null">type_z = #{typeZ},</if>
+            <if test="typeL != null">type_l = #{typeL},</if>
+            <if test="unit != null">unit = #{unit},</if>
+            <if test="version != null">version = #{version},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="supplier != null">supplier = #{supplier},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="dataSource != null">data_source = #{dataSource},</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>
+
+    <delete id="deleteBsMaterialInfoById" parameterType="Long">
+        delete from bs_material_info where id = #{id}
+    </delete>
+
+    <delete id="deleteBsMaterialInfoByIds" parameterType="String">
+        delete from bs_material_info where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/billion-ui/src/api/main/bs/locationInfo.js b/billion-ui/src/api/main/bs/locationInfo.js
new file mode 100644
index 0000000..8177960
--- /dev/null
+++ b/billion-ui/src/api/main/bs/locationInfo.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ宸ヤ綅淇℃伅鍒楄〃
+export function listLocationInfo(query) {
+  return request({
+    url: '/bs/locationInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ宸ヤ綅淇℃伅璇︾粏
+export function getLocationInfo(id) {
+  return request({
+    url: '/bs/locationInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板宸ヤ綅淇℃伅
+export function addLocationInfo(data) {
+  return request({
+    url: '/bs/locationInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼宸ヤ綅淇℃伅
+export function updateLocationInfo(data) {
+  return request({
+    url: '/bs/locationInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎宸ヤ綅淇℃伅
+export function delLocationInfo(id) {
+  return request({
+    url: '/bs/locationInfo/' + id,
+    method: 'delete'
+  })
+}
diff --git a/billion-ui/src/api/main/bs/materialInfo.js b/billion-ui/src/api/main/bs/materialInfo.js
new file mode 100644
index 0000000..aeaf5f6
--- /dev/null
+++ b/billion-ui/src/api/main/bs/materialInfo.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐗╂枡淇℃伅鍒楄〃
+export function listMaterialInfo(query) {
+  return request({
+    url: '/bs/materialInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐗╂枡淇℃伅璇︾粏
+export function getMaterialInfo(id) {
+  return request({
+    url: '/bs/materialInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鐗╂枡淇℃伅
+export function addMaterialInfo(data) {
+  return request({
+    url: '/bs/materialInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐗╂枡淇℃伅
+export function updateMaterialInfo(data) {
+  return request({
+    url: '/bs/materialInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐗╂枡淇℃伅
+export function delMaterialInfo(id) {
+  return request({
+    url: '/bs/materialInfo/' + id,
+    method: 'delete'
+  })
+}
diff --git a/billion-ui/src/views/main/bs/locationInfo/index.vue b/billion-ui/src/views/main/bs/locationInfo/index.vue
new file mode 100644
index 0000000..ed97152
--- /dev/null
+++ b/billion-ui/src/views/main/bs/locationInfo/index.vue
@@ -0,0 +1,300 @@
+<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="locationCode">
+        <el-input
+          v-model="queryParams.locationCode"
+          placeholder="璇疯緭鍏ュ伐浣嶇紪鍙�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="宸ヤ綅鍚嶇О" prop="locationName">
+        <el-input
+          v-model="queryParams.locationName"
+          placeholder="璇疯緭鍏ュ伐浣嶅悕绉�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="宸ヤ綅绫诲瀷" prop="locationType">
+        <el-select v-model="queryParams.locationType" placeholder="璇烽�夋嫨宸ヤ綅绫诲瀷" clearable>
+          <el-option
+            v-for="dict in dict.type.location_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+<!--      <el-form-item label="浜х嚎缂栧彿" prop="lineCode">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.lineCode"-->
+<!--          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>
+
+    <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="['bs:locationInfo: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="['bs:locationInfo: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="['bs:locationInfo: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="['bs:locationInfo:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="locationInfoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column show-overflow-tooltip="true" label="宸ヤ綅缂栧彿" align="center" prop="locationCode" />
+      <el-table-column show-overflow-tooltip="true" label="宸ヤ綅鍚嶇О" align="center" prop="locationName" />
+      <el-table-column label="宸ヤ綅绫诲瀷" align="center" prop="locationType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.location_type" :value="scope.row.locationType"/>
+        </template>
+      </el-table-column>
+      <el-table-column show-overflow-tooltip="true" label="浜х嚎缂栧彿" align="center" prop="lineCode" />
+      <el-table-column show-overflow-tooltip="true" label="澶囨敞" align="center" prop="remarks" />
+      <el-table-column show-overflow-tooltip="true" label="鍒涘缓鐢ㄦ埛" align="center" prop="createBy" />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+      </el-table-column>
+      <el-table-column show-overflow-tooltip="true" 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="locationCode">
+          <el-input v-model="form.locationCode" placeholder="璇疯緭鍏ュ伐浣嶇紪鍙�" />
+        </el-form-item>
+        <el-form-item label="宸ヤ綅鍚嶇О" prop="locationName">
+          <el-input v-model="form.locationName" placeholder="璇疯緭鍏ュ伐浣嶅悕绉�" />
+        </el-form-item>
+        <el-form-item label="宸ヤ綅绫诲瀷" prop="locationType">
+          <el-select style="width: 100%" v-model="form.locationType" placeholder="璇烽�夋嫨宸ヤ綅绫诲瀷">
+            <el-option
+              v-for="dict in dict.type.location_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="浜х嚎缂栧彿" prop="lineCode">
+          <el-input v-model="form.lineCode" placeholder="璇疯緭鍏ヤ骇绾跨紪鍙�" />
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" />
+        </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 { listLocationInfo, getLocationInfo, delLocationInfo, addLocationInfo, updateLocationInfo } from "@/api/main/bs/locationInfo";
+
+export default {
+  name: "LocationInfo",
+  dicts: ['location_type'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 宸ヤ綅淇℃伅琛ㄦ牸鏁版嵁
+      locationInfoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        locationCode: null,
+        locationName: null,
+        locationType: null,
+        lineCode: null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭id涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ宸ヤ綅淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listLocationInfo(this.queryParams).then(response => {
+        this.locationInfoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        locationCode: null,
+        locationName: null,
+        locationType: null,
+        lineCode: null,
+        remarks: 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
+      getLocationInfo(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) {
+            updateLocationInfo(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLocationInfo(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 delLocationInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('bs/locationInfo/export', {
+        ...this.queryParams
+      }, `locationInfo_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/billion-ui/src/views/main/bs/materialInfo/index.vue b/billion-ui/src/views/main/bs/materialInfo/index.vue
new file mode 100644
index 0000000..a013862
--- /dev/null
+++ b/billion-ui/src/views/main/bs/materialInfo/index.vue
@@ -0,0 +1,410 @@
+<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="materialCode">
+        <el-input
+          v-model="queryParams.materialCode"
+          placeholder="璇疯緭鍏ョ墿鏂欑紪鍙�"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐗╂枡鍚嶇О" prop="materialName">
+        <el-input
+          v-model="queryParams.materialName"
+          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-button icon="el-icon-setting" size="mini" @click="toggleAdvancedSearch">楂樼骇鏌ヨ</el-button>
+      </el-form-item>
+      <transition name="fade">
+        <div v-if="advancedSearchVisible" class="advanced-search">
+          <el-form-item label="瑙嗗浘" prop="materialView">
+            <el-input
+              v-model="queryParams.materialView"
+              placeholder="璇疯緭鍏ヨ鍥�"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="绉嶇被" prop="typeZ">
+            <el-select v-model="queryParams.typeZ" placeholder="璇烽�夋嫨绉嶇被" clearable>
+              <el-option
+                v-for="dict in dict.type.type_z"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="绫诲瀷" prop="typeL">
+            <el-select v-model="queryParams.typeL" placeholder="璇烽�夋嫨绫诲瀷" clearable>
+              <el-option
+                v-for="dict in dict.type.type_l"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍗曚綅" prop="unit">
+            <el-select v-model="queryParams.unit" placeholder="璇烽�夋嫨鍗曚綅" clearable>
+              <el-option
+                v-for="dict in dict.type.unit"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </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.sys_normal_disable"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </div>
+      </transition>
+    </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="['bs:materialInfo: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="['bs:materialInfo: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="['bs:materialInfo: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="['bs:materialInfo:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="materialInfoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column :show-overflow-tooltip="true" label="鐗╂枡缂栧彿" align="center" prop="materialCode" />
+      <el-table-column :show-overflow-tooltip="true" label="鐗╂枡鍚嶇О" align="center" prop="materialName" />
+      <el-table-column :show-overflow-tooltip="true" label="瑙嗗浘" align="center" prop="materialView" />
+      <el-table-column label="绉嶇被" align="center" prop="typeZ">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.type_z" :value="scope.row.typeZ"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="绫诲瀷" align="center" prop="typeL">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.type_l" :value="scope.row.typeL"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="鍗曚綅" align="center" prop="unit">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.unit" :value="scope.row.unit"/>
+        </template>
+      </el-table-column>
+      <el-table-column :show-overflow-tooltip="true" label="鐗堟湰" align="center" prop="version" />
+      <el-table-column label="鐘舵��" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column :show-overflow-tooltip="true" label="鍘傚晢" align="center" prop="supplier" />
+      <el-table-column :show-overflow-tooltip="true" label="澶囨敞" align="center" prop="remark" />
+      <el-table-column :show-overflow-tooltip="true" label="鏁版嵁鏉ユ簮" align="center" prop="dataSource" />
+      <el-table-column :show-overflow-tooltip="true" label="鍒涘缓鐢ㄦ埛" align="center" prop="createBy" />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+      </el-table-column>
+      <el-table-column :show-overflow-tooltip="true" 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="materialCode">
+          <el-input v-model="form.materialCode" placeholder="璇疯緭鍏ョ墿鏂欑紪鍙�" />
+        </el-form-item>
+        <el-form-item label="鐗╂枡鍚嶇О" prop="materialName">
+          <el-input v-model="form.materialName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" />
+        </el-form-item>
+        <el-form-item label="瑙嗗浘" prop="materialView">
+          <el-input v-model="form.materialView" placeholder="璇疯緭鍏ヨ鍥�" />
+        </el-form-item>
+        <el-form-item label="绉嶇被" prop="typeZ">
+          <el-select style="width: 100%" v-model="form.typeZ" placeholder="璇烽�夋嫨绉嶇被">
+            <el-option
+              v-for="dict in dict.type.type_z"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="绫诲瀷" prop="typeL">
+          <el-select style="width: 100%" v-model="form.typeL" placeholder="璇烽�夋嫨绫诲瀷">
+            <el-option
+              v-for="dict in dict.type.type_l"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍗曚綅" prop="unit">
+          <el-select style="width: 100%" v-model="form.unit" placeholder="璇烽�夋嫨鍗曚綅">
+            <el-option
+              v-for="dict in dict.type.unit"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐗堟湰" prop="version">
+          <el-input v-model="form.version" 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.sys_normal_disable"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鍘傚晢" prop="supplier">
+          <el-input v-model="form.supplier" placeholder="璇疯緭鍏ュ巶鍟�" />
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
+        </el-form-item>
+        <el-form-item label="鏁版嵁鏉ユ簮" prop="dataSource">
+          <el-input v-model="form.dataSource" placeholder="璇疯緭鍏ユ暟鎹潵婧�" />
+        </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 { listMaterialInfo, getMaterialInfo, delMaterialInfo, addMaterialInfo, updateMaterialInfo } from "@/api/main/bs/materialInfo";
+
+export default {
+  name: "MaterialInfo",
+  dicts: ['sys_normal_disable', 'type_l', 'unit', 'type_z'],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      advancedSearchVisible: false,
+      // 鐗╂枡淇℃伅琛ㄦ牸鏁版嵁
+      materialInfoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        materialCode: null,
+        materialName: null,
+        materialView: null,
+        typeZ: null,
+        typeL: null,
+        unit: null,
+        status: null,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭id涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        materialCode: [
+          { required: true, message: "鐗╂枡缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        materialName: [
+          { required: true, message: "鐗╂枡鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    toggleAdvancedSearch() {
+      this.advancedSearchVisible = !this.advancedSearchVisible;
+    },
+    /** 鏌ヨ鐗╂枡淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listMaterialInfo(this.queryParams).then(response => {
+        this.materialInfoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: null,
+        materialCode: null,
+        materialName: null,
+        materialView: null,
+        typeZ: null,
+        typeL: null,
+        unit: null,
+        version: null,
+        status: "0",
+        supplier: null,
+        remark: null,
+        dataSource: 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
+      getMaterialInfo(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) {
+            updateMaterialInfo(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addMaterialInfo(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 delMaterialInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('bs/materialInfo/export', {
+        ...this.queryParams
+      }, `materialInfo_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/billion-ui/src/views/main/bs/routeInfo/ProductSelector.vue b/billion-ui/src/views/main/bs/routeInfo/ProductSelector.vue
new file mode 100644
index 0000000..35b07c5
--- /dev/null
+++ b/billion-ui/src/views/main/bs/routeInfo/ProductSelector.vue
@@ -0,0 +1,58 @@
+<template>
+  <el-dialog :title="title" :visible.sync="visible" @close="handleClose">
+    <el-table :data="gridData" selection="single" ref="multipleTable" @selection-change="productSelectionChange">
+      <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column property="date" label="鏃ユ湡" width="150"></el-table-column>
+      <el-table-column property="name" label="濮撳悕" width="200"></el-table-column>
+      <el-table-column property="address" label="鍦板潃"></el-table-column>
+    </el-table>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handleClose">鍙� 娑�</el-button>
+      <el-button type="primary" @click="confirmSelection">纭� 瀹�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: "ProductSelector",
+  props: {
+    visible: Boolean,
+    title: {
+      type: String,
+      default: "鐗╂枡淇℃伅"
+    },
+    gridData: Array
+  },
+  data() {
+    return {
+      multipleSelection: []
+    };
+  },
+  methods: {
+    handleClose() {
+      this.$emit('update:visible', false);
+    },
+    productSelectionChange(selection) {
+      if (selection.length > 1) {
+        this.$refs.multipleTable.clearSelection();
+        this.$refs.multipleTable.toggleRowSelection(selection[selection.length - 1], true);
+        this.multipleSelection = [selection[selection.length - 1]];
+      } else {
+        this.multipleSelection = selection;
+      }
+    },
+    confirmSelection() {
+      if (this.multipleSelection.length > 0) {
+        this.$emit('select-product', this.multipleSelection[0]);
+        this.handleClose();
+      } else {
+        this.$message({
+          message: '璀﹀憡鍝︼紝鏈�夋嫨浠讳綍琛�',
+          type: 'warning'
+        });
+      }
+    }
+  }
+};
+</script>
diff --git a/billion-ui/src/views/main/bs/routeInfo/index.vue b/billion-ui/src/views/main/bs/routeInfo/index.vue
index c310d30..99a64f4 100644
--- a/billion-ui/src/views/main/bs/routeInfo/index.vue
+++ b/billion-ui/src/views/main/bs/routeInfo/index.vue
@@ -117,21 +117,21 @@
           </router-link>
         </template>
       </el-table-column>
-      <el-table-column show-overflow-tooltip="true" label="娴佺▼鍚嶇О" align="center" prop="routeName" />
-      <el-table-column show-overflow-tooltip="true" label="浜у搧缂栫爜" align="center" prop="productCode" />
-      <el-table-column show-overflow-tooltip="true" label="浜у搧鍚嶇О" align="center" prop="productName" />
-      <el-table-column show-overflow-tooltip="true" label="鐗堟湰" align="center" prop="version" />
+      <el-table-column :show-overflow-tooltip="true" label="娴佺▼鍚嶇О" align="center" prop="routeName" />
+      <el-table-column :show-overflow-tooltip="true" label="浜у搧缂栫爜" align="center" prop="productCode" />
+      <el-table-column :show-overflow-tooltip="true" label="浜у搧鍚嶇О" align="center" prop="productName" />
+      <el-table-column :show-overflow-tooltip="true" label="鐗堟湰" align="center" prop="version" />
       <el-table-column label="鐘舵��" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
         </template>
       </el-table-column>
-      <el-table-column show-overflow-tooltip="true" label="鏁版嵁鏉ユ簮" align="center" prop="dataSource" />
-      <el-table-column show-overflow-tooltip="true" label="澶囨敞" align="center" prop="remark" />
-      <el-table-column show-overflow-tooltip="true" label="鍒涘缓鐢ㄦ埛" align="center" prop="createBy" />
+      <el-table-column :show-overflow-tooltip="true" label="鏁版嵁鏉ユ簮" align="center" prop="dataSource" />
+      <el-table-column :show-overflow-tooltip="true" label="澶囨敞" align="center" prop="remark" />
+      <el-table-column :show-overflow-tooltip="true" label="鍒涘缓鐢ㄦ埛" align="center" prop="createBy" />
       <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
       </el-table-column>
-      <el-table-column show-overflow-tooltip="true" label="鏇存敼鐢ㄦ埛" align="center" prop="updateBy" />
+      <el-table-column :show-overflow-tooltip="true" label="鏇存敼鐢ㄦ埛" align="center" prop="updateBy" />
       <el-table-column label="鏇存敼鏃堕棿" align="center" prop="updateTime" width="180">
       </el-table-column>
     </el-table>
@@ -157,7 +157,11 @@
           <el-input v-model="form.routeName" placeholder="璇疯緭鍏ユ祦绋嬪悕绉�" />
         </el-form-item>
         <el-form-item label="浜у搧缂栫爜" prop="productCode">
-          <el-input v-model="form.productCode" placeholder="璇疯緭鍏ヤ骇鍝佺紪鐮�" />
+          <el-input v-model="form.productCode" placeholder="璇烽�夋嫨浜у搧缂栫爜" readonly>
+            <template #append>
+              <el-button @click="dialogTableVisible = true">閫夋嫨</el-button>
+            </template>
+          </el-input>
         </el-form-item>
         <el-form-item label="浜у搧鍚嶇О" prop="productName">
           <el-input v-model="form.productName" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�" />
@@ -186,17 +190,46 @@
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
+    <!-- 浜у搧閫夋嫨鍣ㄧ粍浠� -->
+    <ProductSelector
+      :visible="dialogTableVisible"
+      :gridData="gridData"
+      @select-product="handleSelectProduct"
+      @update:visible="dialogTableVisible = $event"
+    />
   </div>
 </template>
 
 <script>
 import { listRouteInfo, getRouteInfo, delRouteInfo, addRouteInfo, updateRouteInfo } from "@/api/main/bs/routeInfo";
-
+import ProductSelector from "./ProductSelector.vue";
 export default {
+  components: {
+    ProductSelector
+  },
   name: "RouteInfo",
   dicts: ['sys_normal_disable'],
   data() {
     return {
+      multipleSelection: [],
+      gridData: [{
+        date: '2016-05-02',
+        name: '鐜嬩竴铏�',
+        address: '涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�'
+      }, {
+        date: '2016-05-04',
+        name: '鐜嬩簩铏�',
+        address: '涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�'
+      }, {
+        date: '2016-05-01',
+        name: '鐜嬩笁铏�',
+        address: '涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�'
+      }, {
+        date: '2016-05-03',
+        name: '鐜嬪洓铏�',
+        address: '涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�'
+      }],
+      dialogTableVisible: false,
       advancedSearchVisible: false,
       // 閬僵灞�
       loading: true,
@@ -247,6 +280,10 @@
     this.getList();
   },
   methods: {
+    handleSelectProduct(selectedProduct) {
+      this.form.productCode = selectedProduct.date;  // 鍋囪浣犻渶瑕佺殑鏄棩鏈熷瓧娈�
+      this.form.productName = selectedProduct.name;  // 鍋囪浣犻渶瑕佺殑鏄鍚嶅瓧娈�
+    },
     toggleAdvancedSearch() {
       this.advancedSearchVisible = !this.advancedSearchVisible;
     },

--
Gitblit v1.9.3