| | |
| | | package com.zy.asrs.controller; |
| | | |
| | | import com.alibaba.excel.EasyExcel; |
| | | import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | |
| | | |
| | | import com.zy.asrs.entity.result.WrkTraceVo; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.MatExcelListener; |
| | | import com.zy.asrs.utils.OrderExcelListener; |
| | | import com.zy.common.entity.MatExcel; |
| | | import com.zy.common.entity.OrderExcel; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.web.BaseController; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.net.URLEncoder; |
| | | import java.util.*; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | @RestController |
| | | public class OrderController extends BaseController { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * excel导入模板下载 |
| | | */ |
| | | @RequestMapping(value = "/orders/excel/import/mould") |
| | | public void matExcelImportMould(HttpServletResponse response) throws IOException { |
| | | List<OrderExcel> excels = new ArrayList<>(); |
| | | response.setContentType("application/vnd.ms-excel"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | String fileName = URLEncoder.encode("单据Excel导入模板", "UTF-8"); |
| | | response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); |
| | | EasyExcel.write(response.getOutputStream(), OrderExcel.class) |
| | | .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) |
| | | .sheet("sheet1") |
| | | .doWrite(excels); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 单据导入 |
| | | * @author Ryan |
| | | * @date 2026/1/8 17:17 |
| | | * @param file |
| | | * @return com.core.common.R |
| | | */ |
| | | @PostMapping(value = "/orders/excel/import/auth") |
| | | @ManagerAuth(memo = "单据导入") |
| | | @Transactional |
| | | public R matExcelImport(MultipartFile file) throws IOException { |
| | | OrderExcelListener listener = new OrderExcelListener(getUserId()); |
| | | EasyExcel.read(file.getInputStream(), OrderExcel.class, listener).sheet().doRead(); |
| | | return R.ok("成功同步" + listener.getTotal() + "条商品数据"); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/order/update/auth") |
| | | @ManagerAuth |
| | | public R update(Order order){ |
| | |
| | | package com.zy.asrs.entity; |
| | | |
| | | import com.alibaba.excel.annotation.ExcelProperty; |
| | | import com.baomidou.mybatisplus.annotations.TableField; |
| | | import com.baomidou.mybatisplus.annotations.TableId; |
| | | import com.baomidou.mybatisplus.annotations.TableName; |
| | |
| | | * 单据编号 |
| | | */ |
| | | @ApiModelProperty(value= "单据编号") |
| | | @ExcelProperty(index = 0, value = "单号") |
| | | @TableField("order_no") |
| | | private String orderNo; |
| | | |
| | |
| | | * 数量 |
| | | */ |
| | | @ApiModelProperty(value= "数量") |
| | | @ExcelProperty(value = "数量") |
| | | private Double anfme; |
| | | |
| | | /** |
| | |
| | | * 商品编码 |
| | | */ |
| | | @ApiModelProperty(value= "商品编码") |
| | | @ExcelProperty(value = "商品编码") |
| | | private String matnr; |
| | | |
| | | /** |
| | | * 商品名称 |
| | | */ |
| | | @ApiModelProperty(value= "商品名称") |
| | | @ExcelProperty(value = "商品名称") |
| | | private String maktx; |
| | | |
| | | /** |
| | | * 批号 |
| | | */ |
| | | @ApiModelProperty(value= "批号") |
| | | @ExcelProperty(value = "批号") |
| | | private String batch; |
| | | |
| | | /** |
| | | * 规格 |
| | | */ |
| | | @ApiModelProperty(value= "规格") |
| | | @ExcelProperty(value = "规格") |
| | | private String specs; |
| | | |
| | | /** |
| | | * 型号 |
| | | */ |
| | | @ApiModelProperty(value= "型号") |
| | | @ExcelProperty(value = "型号") |
| | | private String model; |
| | | |
| | | /** |
| | |
| | | * 品牌 |
| | | */ |
| | | @ApiModelProperty(value= "品牌") |
| | | @ExcelProperty(value = "品牌") |
| | | private String brand; |
| | | |
| | | /** |
| | | * 单位 |
| | | */ |
| | | @ApiModelProperty(value= "单位") |
| | | @ExcelProperty(value = "单位") |
| | | private String unit; |
| | | |
| | | /** |
| | |
| | | * 条码 |
| | | */ |
| | | @ApiModelProperty(value= "条码") |
| | | @ExcelProperty(value = "SN码") |
| | | private String barcode; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @ApiModelProperty(value= "安全库存量") |
| | | @TableField("safe_qty") |
| | | @ExcelProperty(value = "归零阀值") |
| | | private Double safeQty; |
| | | |
| | | /** |
| | |
| | | * 体积 |
| | | */ |
| | | @ApiModelProperty(value= "体积") |
| | | @ExcelProperty(value = "km/cm") |
| | | private Double volume; |
| | | |
| | | /** |
| New file |
| | |
| | | package com.zy.asrs.utils; |
| | | |
| | | import com.alibaba.excel.context.AnalysisContext; |
| | | import com.alibaba.excel.event.AnalysisEventListener; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.SpringUtils; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.Mat; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.entity.OrderDetl; |
| | | import com.zy.asrs.service.DocTypeService; |
| | | import com.zy.asrs.service.MatService; |
| | | import com.zy.asrs.service.OrderDetlService; |
| | | import com.zy.asrs.service.OrderService; |
| | | import com.zy.common.entity.OrderExcel; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.util.*; |
| | | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | @Slf4j |
| | | public class OrderExcelListener extends AnalysisEventListener<OrderExcel> { |
| | | |
| | | private int total = 0; |
| | | private Long userId; |
| | | |
| | | public OrderExcelListener(Long userId) { |
| | | this.userId = userId; |
| | | } |
| | | |
| | | /** |
| | | * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 |
| | | */ |
| | | private static final int BATCH_COUNT = 50; |
| | | |
| | | private final List<OrderExcel> list = new ArrayList<>(); |
| | | |
| | | /** |
| | | * 这里会一行行的返回头 |
| | | */ |
| | | @Override |
| | | public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 单据导入实现 |
| | | * @author Ryan |
| | | * @date 2026/1/8 17:25 |
| | | * @param data |
| | | * @param context |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void invoke(OrderExcel data, AnalysisContext context) { |
| | | OrderService orderService = (OrderService) SpringUtils.getBean(OrderService.class); |
| | | OrderDetlService detlService = (OrderDetlService) SpringUtils.getBean(OrderDetlService.class); |
| | | MatService matService = SpringUtils.getBean(MatService.class); |
| | | DocTypeService docTypeService = SpringUtils.getBean(DocTypeService.class); |
| | | Date now = new Date(); |
| | | if (Objects.isNull(data)) { |
| | | throw new CoolException("参数不能为空!!"); |
| | | } |
| | | if (Objects.isNull(data.getOrderNo())) { |
| | | throw new CoolException("订单已创建,不可以重复创建!!"); |
| | | } |
| | | if (Objects.isNull(data.getDocType())) { |
| | | throw new CoolException("单据类型不能为空!"); |
| | | } |
| | | DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", data.getDocType())); |
| | | if (Objects.isNull(docType)) { |
| | | throw new CoolException("单据类型[" + data.getDocType() + "]不存在!!"); |
| | | } |
| | | |
| | | Order order = new Order(); |
| | | order.setOrderNo(data.getOrderNo()); |
| | | order.setDocType(docType.getDocId()); |
| | | order.setCreateTime(now); |
| | | order.setUpdateTime(now); |
| | | order.setSettle(1L); |
| | | order.setStatus(1); |
| | | order.setCreateBy(userId); |
| | | order.setUpdateBy(userId); |
| | | order.setPakinPakoutStatus(docType.getPakin() == 1 ? 1 : 2); |
| | | if (!orderService.insert(order)) { |
| | | throw new CoolException("订单创建失败!!"); |
| | | } |
| | | if (Objects.isNull(data.getMatnr())) { |
| | | throw new CoolException("物料编码不能为空!"); |
| | | } |
| | | Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", data.getMatnr())); |
| | | if (Objects.isNull(mat)) { |
| | | throw new CoolException("物料[" + data.getMatnr() + "]不存在!!"); |
| | | } |
| | | OrderDetl detl = new OrderDetl(); |
| | | detl.setOrderNo(data.getOrderNo()); |
| | | detl.setOrderId(order.getId()); |
| | | detl.setMatnr(data.getMatnr()); |
| | | detl.setMaktx(mat.getMaktx()); |
| | | detl.setQty(data.getQty()); |
| | | detl.setBatch(data.getBatch()); |
| | | detl.setVolume(data.getVolume()); |
| | | detl.setSafeQty(mat.getSafeQty()); |
| | | detl.setAnfme(data.getAnfme()); |
| | | detl.setBarcode(data.getBarcode()); |
| | | detl.setUpdateTime(now); |
| | | detl.setCreateTime(now); |
| | | detl.setUpdateBy(userId); |
| | | detl.setCreateBy(userId); |
| | | if (!detlService.insert(detl)) { |
| | | throw new CoolException("订单详情创建失败!!"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void doAfterAllAnalysed(AnalysisContext context) { |
| | | log.info("新增{}条物料信息!", total); |
| | | } |
| | | |
| | | public int getTotal() { |
| | | return total; |
| | | } |
| | | |
| | | } |
| New file |
| | |
| | | package com.zy.common.entity; |
| | | |
| | | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; |
| | | import com.alibaba.excel.annotation.ExcelProperty; |
| | | import com.zy.asrs.entity.OrderDetl; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class OrderExcel extends OrderDetl { |
| | | |
| | | @ExcelProperty(index = 1, value = "单据类型") |
| | | private String docType; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | // ,{field: 'uuid', align: 'center',title: '编号'} |
| | | ,{field: 'maktx', align: 'center',title: '商品名称(品名)', width: 200} |
| | | ,{field: 'specs', align: 'center',title: '规格'} |
| | | ,{field: 'safeQty', align: 'center',title: '归零阀值'} |
| | | , { field: 'safeQty', align: 'center', title: '归零阀值' , templet: function (d) { |
| | | var raw = d.safeQty; |
| | | if (raw === null || raw === undefined) return ''; |
| | | if (typeof raw === 'string' && raw.trim() === '') return ''; |
| | | var num = Number(raw); |
| | | if (!isFinite(num)) return ''; |
| | | return num.toFixed(2); |
| | | }} |
| | | ,{field: 'model', align: 'center',title: '代码', hide: true} |
| | | ,{field: 'color', align: 'center',title: '颜色', hide: true} |
| | | ,{field: 'brand', align: 'center',title: '品牌', hide: true} |
| | |
| | | ,{field: 'itemNum', align: 'center',title: '品项数', hide: true} |
| | | ,{field: 'weight', align: 'center',title: '单箱净重', hide: true} |
| | | ,{field: 'length', align: 'center',title: '单箱毛重', hide: true} |
| | | ,{field: 'volume', align: 'center',title: '单箱体积', hide: true} |
| | | , { |
| | | field: 'volume', align: 'center', title: 'kg/cm', templet: function (d) { |
| | | var raw = d.volume; |
| | | if (raw === null || raw === undefined) return ''; |
| | | if (typeof raw === 'string' && raw.trim() === '') return ''; |
| | | var num = Number(raw); |
| | | if (!isFinite(num)) return ''; |
| | | return num.toFixed(2); |
| | | } |
| | | } |
| | | ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true} |
| | | ,{field: 'supp', align: 'center',title: '供应商', hide: true} |
| | | ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true} |
| | |
| | | ,{field: 'updateBy$', align: 'center',title: '修改人员', hide: true} |
| | | ,{field: 'updateTime$', align: 'center',title: '修改时间', hide: true} |
| | | ,{field: 'memo', align: 'center',title: '备注', hide: true} |
| | | |
| | | ] |
| | | |
| | | var cacheCols = [ |
| | |
| | | ,{field: 'brand', align: 'center',title: '品牌', hide: true} |
| | | ,{field: 'unit', align: 'center',title: '单位', hide: false} |
| | | ,{field: 'batch', align: 'center',title: '货品特征', sort:true} |
| | | ,{field: 'frozen$', align: 'center',title: '冻结否',hide: true, |
| | | , { |
| | | field: 'frozen$', align: 'center', title: '冻结否', hide: true, |
| | | templet: function(d) { |
| | | // 根据条件判断字体颜色 |
| | | if (d.frozen$ === '已冻结') { |
| | |
| | | } else { |
| | | return '<span">' +d.frozen$ + '</span>'; |
| | | } |
| | | }} |
| | | } |
| | | } |
| | | ] |
| | | |
| | | var detlCols = [ |
| | |
| | | ,{field: 'source$', align: 'center',title: '制购', hide: true} |
| | | ,{field: 'check$', align: 'center',title: '要求检验', hide: true} |
| | | ,{field: 'danger$', align: 'center',title: '危险品', hide: true} |
| | | ,{field: 'frozen$', align: 'center',title: '冻结否',hide: true, |
| | | , { |
| | | field: 'frozen$', align: 'center', title: '冻结否', hide: true, |
| | | templet: function(d) { |
| | | // 根据条件判断字体颜色 |
| | | if (d.frozen$ === '已冻结') { |
| | |
| | | } else { |
| | | return '<span">' +d.frozen$ + '</span>'; |
| | | } |
| | | }} |
| | | } |
| | | } |
| | | ] |
| | | |
| | | function getQueryVariable(variable) |
| | | { |
| | | function getQueryVariable(variable) { |
| | | var query = window.location.search.substring(1); |
| | | var vars = query.split("&"); |
| | | for (var i=0;i<vars.length;i++) { |
| | |
| | | var insTbCount = 0; |
| | | var admin; |
| | | layui.config({ |
| | | base: baseUrl + "/static/layui/lay/modules/" |
| | | }).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () { |
| | |
| | | var form = layui.form; |
| | | var table = layui.table; |
| | | var util = layui.util; |
| | | var admin = layui.admin; |
| | | admin = layui.admin; |
| | | var xmSelect = layui.xmSelect; |
| | | var layDate = layui.laydate; |
| | | var laytpl = layui.laytpl; |
| | |
| | | url: baseUrl+'/order/head/page/auth', |
| | | headers: {token: localStorage.getItem('token')}, |
| | | page: true, |
| | | toolbar: '#toolbar', |
| | | cellMinWidth: 100, |
| | | cols: [[ |
| | | {type: 'numbers'}, |
| | |
| | | ,range: true |
| | | }); |
| | | }); |
| | | |
| | | // excel导入模板下载 |
| | | function excelMouldDownload() { |
| | | layer.load(1, { shade: [0.1, '#fff'] }); |
| | | location.href = baseUrl + "/orders/excel/import/mould"; |
| | | layer.closeAll('loading'); |
| | | } |
| | | |
| | | // excel导入 |
| | | function importExcel() { |
| | | $("#importExcel").trigger("click"); |
| | | } |
| | | |
| | | // excel导入模板下载 |
| | | function excelMouldDownload() { |
| | | layer.load(1, {shade: [0.1, '#fff']}); |
| | | location.href = baseUrl + "/mat/excel/import/mould"; |
| | | layer.closeAll('loading'); |
| | | } |
| | | |
| | | // excel导入 |
| | | function importExcel() { |
| | | $("#importExcel").trigger("click"); |
| | | } |
| | | |
| | | function upload(obj) { |
| | | if (!obj.files) { |
| | | return; |
| | | } |
| | | var file = obj.files[0]; |
| | | admin.confirm('确认同步 [' + file.name + '] 文件吗?', function (index) { |
| | | layer.load(1, {shade: [0.1, '#fff']}); |
| | | var url = baseUrl + "/orders/excel/import/auth"; |
| | | var form = new FormData(); |
| | | form.append("file", file); |
| | | xhr = new XMLHttpRequest(); |
| | | xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。 |
| | | xhr.setRequestHeader('token', localStorage.getItem('token')); |
| | | xhr.onload = uploadComplete; //请求完成 |
| | | xhr.onerror = uploadFailed; //请求失败 |
| | | xhr.onloadend = function () { // // 上传完成重置文件流 |
| | | layer.closeAll('loading'); |
| | | $("#importExcel").val(""); |
| | | }; |
| | | // xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】 |
| | | xhr.upload.onloadstart = function () {//上传开始执行方法 |
| | | ot = new Date().getTime(); //设置上传开始时间 |
| | | oloaded = 0;//设置上传开始时,以上传的文件大小为0 |
| | | }; |
| | | xhr.send(form); |
| | | }, function (index) { |
| | | $("#importExcel").val(""); |
| | | }); |
| | | } |
| | | |
| | | function uploadComplete(evt) { |
| | | var res = JSON.parse(evt.target.responseText); |
| | | if (res.code === 200) { |
| | | layer.msg(res.msg, {icon: 1}); |
| | | loadTree(""); |
| | | } else { |
| | | layer.msg(res.msg, {icon: 2}); |
| | | } |
| | | } |
| | | |
| | | function uploadFailed(evt) { |
| | | var res = JSON.parse(evt.target.responseText); |
| | | layer.msg(res.msg, {icon: 2}); |
| | | } |
| | | |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title></title> |
| | |
| | | .layui-timeline:first-child .layui-timeline-item { |
| | | margin-top: 30px; |
| | | } |
| | | |
| | | .btn-add { |
| | | display: none; |
| | | } |
| | | |
| | | .btn-edit { |
| | | display: none; |
| | | } |
| | | |
| | | .btn-complete { |
| | | display: none; |
| | | } |
| | | |
| | | .btn-delete { |
| | | display: none; |
| | | } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | |
| | | <body> |
| | | <!-- 正文开始 --> |
| | | <div class="layui-fluid"> |
| | | <div class="layui-card"> |
| | |
| | | </div> |
| | | <div class="layui-inline" style="width: 300px"> |
| | | <div class="layui-input-inline"> |
| | | <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> |
| | | <input class="layui-input layui-laydate-range" name="create_time" type="text" |
| | | placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | |
| | | <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit> |
| | | <i class="layui-icon"></i>搜索 |
| | | </button> |
| | | <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon"></i>添加 |
| | | <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i |
| | | class="layui-icon"></i>添加 |
| | | </button> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <script type="text/html" id="toolbar"> |
| | | <div class="layui-btn-container"> |
| | | <!-- 商品/物料 数据中心 --> |
| | | <div class="dropdown-menu" style="float: right"> |
| | | <button class="layui-btn layui-btn-primary layui-border-black icon-btn layui-btn-sm"> Excel模板 <i class="layui-icon layui-icon-drop"></i></button> |
| | | <ul class="dropdown-menu-nav dark"> |
| | | <div class="dropdown-anchor"></div> |
| | | <li class="title">1st menu</li> |
| | | <li><a onclick="excelMouldDownload()" style="font-size: 12px"><i class="layui-icon layui-icon-template-1"></i>模板下载</a></li> |
| | | <li><a onclick="importExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-upload"></i>导入 Excel</a></li> |
| | | <li style="display: none"><input id="importExcel" type="file" onchange="upload(this)" ></li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </script> |
| | | |
| | | <!-- 表格操作列 --> |
| | | <script type="text/html" id="operate"> |
| | | {{# if (d.settle == 0 || d.settle == 1) { }} |
| | |
| | | {{# } }} |
| | | <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看任务追溯" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i> |
| | | </script> |
| | | |
| | | <!--<script type="text/html" id="settleTpl">--> |
| | | <!-- <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>--> |
| | | <!--</script>--> |
| | | <script type="text/html" id="settleTpl"> |
| | | <span name="settle" |
| | | {{# if( d.settle === 1){ }} |
| | |
| | | {{# } }} |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | </script> |
| | | <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script> |
| | |
| | | <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/order/order.js" charset="utf-8"></script> |
| | | <script> |
| | | layui.config({ |
| | | base: baseUrl + "/static/layui/lay/modules/" |
| | | }).extend({ |
| | | dropdown: 'dropdown/dropdown' |
| | | }).use(['dropdown'], function () { |
| | | var dropdown = layui.dropdown; |
| | | dropdown.init(); |
| | | dropdown.openClickNavClose(); |
| | | }); |
| | | </script> |
| | | |
| | | <script type="text/template" id="docTypeTpl"> |
| | | <option value="">选择类型</option> |
| | |
| | | </body> |
| | | |
| | | </html> |
| | | |