zhangjiaqing
2026-03-25 bd5b217c575e39b077fd2b12f51e63d339f978e3
采购申请页面加导入功能,采购物品信息添加页面物品类型修复
3个文件已修改
2个文件已添加
245 ■■■■■ 已修改文件
public/components/common/editResourceStore/editResourceStore.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/components/common/importPurchaseApply/importPurchaseApply.html 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/components/common/importPurchaseApply/importPurchaseApply.js 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/common/purchaseApplyManage/purchaseApplyManage.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/pages/common/purchaseApplyManage/purchaseApplyManage.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/components/common/editResourceStore/editResourceStore.js
@@ -185,13 +185,20 @@
                            errInfo: "最小计量单位数量不能为空"
                        }
                    ],
                    'editResourceStoreInfo.rstId': [
                    'editResourceStoreInfo.parentRstId': [
                        {
                            limit: "required",
                            param: "",
                            errInfo: "物品类型不能为空"
                        }
                    ],
                    'editResourceStoreInfo.rstId': [
                        {
                            limit: "required",
                            param: "",
                            errInfo: "二级分类不能为空"
                        }
                    ],
                });
            },
            decide: function () {
public/components/common/importPurchaseApply/importPurchaseApply.html
New file
@@ -0,0 +1,60 @@
<div id="importPurchaseApplyModel" class="modal fade" role="dialog" aria-labelledby="exampleModalLabel"
     aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-body">
                <h3 class="m-t-none m-b ">
                    <span><vc:i18n name="采购申请导入" namespace="importPurchaseApply"></vc:i18n></span>
                </h3>
                <div class="ibox-content">
                    <div>
                        <div>
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">
                                    <span><vc:i18n name="选择文件" namespace="importPurchaseApply"></vc:i18n></span>
                                </label>
                                <div class="col-sm-10">
                                    <div class="input-group">
                                        <input type="text" class="form-control"
                                               :value="!importPurchaseApplyInfo.excelTemplate?'必填,请选择数据文件':importPurchaseApplyInfo.excelTemplate.name"
                                               readonly>
                                        <div class="input-group-append">
                                            <button class="btn btn-outline-secondary" type="button"
                                                    onclick="document.getElementById('excelTemplate').click()">
                                                选择
                                            </button>
                                        </div>
                                        <input id="excelTemplate" ref="excelTemplate" type="file"
                                               class="form-control d-none" name="excelTemplate"
                                               v-on:change="getExcelTemplate($event)" accept=".xls,.xlsx">
                                    </div>
                                </div>
                            </div>
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">
                                    <span><vc:i18n name="下载模板" namespace="importPurchaseApply"></vc:i18n></span>
                                </label>
                                <div class="col-sm-10">
                                    请先下载
                                    <a href="/import/importPurchaseApply.xlsx" target="_blank">
                                        <span><vc:i18n name="采购申请模板" namespace="importPurchaseApply"></vc:i18n></span>
                                    </a>
                                    <span><vc:i18n name="准备数据后" namespace="importPurchaseApply"></vc:i18n></span>,上传导入
                                </div>
                            </div>
                            <div class="ibox-content">
                                <button class="btn btn-primary float-right" type="button" v-on:click="_importData()">
                                    <i class="fa fa-check"></i>&nbsp;导入
                                </button>
                                <button type="button" class="btn btn-warning float-right" style="margin-right:20px;"
                                        data-dismiss="modal">
                                    <i class="fa fa-close"></i>&nbsp;取消
                                </button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
public/components/common/importPurchaseApply/importPurchaseApply.js
New file
@@ -0,0 +1,164 @@
(function (vc) {
    var $that = this;
    vc.extends({
        data: {
            importPurchaseApplyInfo: {
                communityId: vc.getCurrentCommunity().communityId,
                excelTemplate: ''
            }
        },
        _initEvent: function () {
            vc.on('importPurchaseApply', 'openImportPurchaseApplyModal', function () {
                $('#importPurchaseApplyModel').modal('show');
                $that.resetImportForm();
            });
            // 监听模态框关闭事件,重置表单
            $('#importPurchaseApplyModel').on('hidden.bs.modal', function () {
                $that.resetImportForm();
            });
        },
        methods: {
            importPurchaseApplyValidate() {
                return vc.validate.validate({
                    importPurchaseApplyInfo: $that.importPurchaseApplyInfo
                }, {
                    'importPurchaseApplyInfo.communityId': [{
                        limit: "required",
                        param: "",
                        errInfo: "数据异常还没有入驻小区"
                    }],
                    'importPurchaseApplyInfo.excelTemplate': [{
                        limit: "required",
                        param: "",
                        errInfo: "文件不能为空"
                    }]
                });
            },
            // 重置导入表单
            resetImportForm() {
                $that.importPurchaseApplyInfo = {
                    communityId: vc.getCurrentCommunity().communityId,
                    excelTemplate: ''
                };
                // 重置文件输入框
                var fileInput = document.getElementById('excelTemplate');
                if (fileInput) {
                    fileInput.value = '';
                }
                console.log('导入表单已重置');
            },
            getExcelTemplate: function (e) {
                if (e.target.files && e.target.files[0]) {
                    $that.importPurchaseApplyInfo.excelTemplate = e.target.files[0];
                    console.log('选择的文件:', $that.importPurchaseApplyInfo.excelTemplate);
                } else {
                    $that.importPurchaseApplyInfo.excelTemplate = '';
                    console.log('未选择文件');
                }
            },
            _importData: function () {
                if (!$that.importPurchaseApplyValidate()) {
                    vc.toast(vc.validate.errInfo);
                    return;
                }
                // 导入数据
                if (!$that.checkFileType($that.importPurchaseApplyInfo.excelTemplate.name.split('.')[1])) {
                    vc.toast('不是有效的Excel格式');
                    return;
                }
                // 使用实际的userId,如果没有则使用默认值
                let userId = '-1';
                try {
                    // 尝试从不同来源获取userId
                    let userInfo = vc.getData('userInfo');
                    if (userInfo && userInfo.userId) {
                        userId = userInfo.userId;
                    } else {
                        // 尝试从localStorage直接获取
                        let localUserInfo = JSON.parse(window.localStorage.getItem('userInfo'));
                        if (localUserInfo && localUserInfo.userId) {
                            userId = localUserInfo.userId;
                        }
                    }
                } catch (e) {
                    console.error('获取userId失败:', e);
                }
                console.log('使用的userId:', userId);
                // 构建表单数据,与房产导入保持一致
                var param = new FormData();
                param.append("uploadFile", $that.importPurchaseApplyInfo.excelTemplate); // 添加Excel文件
                param.append('communityId', $that.importPurchaseApplyInfo.communityId); // 添加小区ID
                param.append('importAdapt', "importPurchaseApply"); // 指定使用的导入适配器
                param.append('userId', userId); // 添加userId参数
                param.append('USER-ID', userId); // 添加USER-ID参数(大写形式),与房产导入保持一致
                // 上传文件并处理响应,与房产导入保持一致
                vc.http.upload(
                    'assetImport', // 模块名
                    'importData', // 方法名
                    param, // 参数
                    {
                        // 移除emulateJSON,避免与Content-Type冲突
                        headers: {
                            "Content-Type": "multipart/form-data"
                        }
                    },
                    function(json, res) {
                        // 成功回调
                        console.log('导入请求成功响应:', json); // 打印完整的响应数据到console
                        let _json = JSON.parse(json);
                        console.log('解析后的响应数据:', _json); // 打印解析后的响应数据到console
                        if (_json.code == 0) {
                            // 导入成功
                            vc.toast("处理成功");
                            console.log('导入成功,logId:', _json.data.logId); // 打印logId到console
                            $('#importPurchaseApplyModel').modal('hide'); // 关闭模态框
                            // 跳转到导入日志详情页面
                            vc.jumpToPage('/#/pages/property/assetImportLogDetail?logId=' + _json.data.logId + '&logType=importPurchaseApply');
                            return;
                        }
                        // 导入失败,显示错误信息
                        console.log('导入失败,错误信息:', _json.msg); // 打印失败错误信息到console
                        // 确保错误信息有意义,避免显示"数据有误: null"
                        let errorMsg = _json.msg;
                        if (!errorMsg || errorMsg === null || errorMsg === undefined || errorMsg.includes('null') || errorMsg.includes('undefined')) {
                            errorMsg = '导入失败,请检查数据格式是否正确,或联系管理员查看详细日志';
                        }
                        // 优化错误信息显示,替换不友好的后端错误
                        if (errorMsg.includes('sheet 未找到') || errorMsg.includes('excel sheet')) {
                            errorMsg = '导入失败:未找到正确的sheet,请确保Excel文件中包含名称为"登记表"的sheet,且名称正确无空格';
                        }
                        vc.toast(errorMsg, 10000);
                    },
                    function(errInfo, error) {
                        // 失败回调
                        console.log('请求失败处理,原始错误信息:', errInfo); // 打印原始错误信息到console
                        console.log('请求失败,错误对象:', error); // 打印完整的错误对象到console
                        // 确保错误信息有意义,避免显示"null"或空错误
                        let errorMsg = errInfo;
                        if (!errorMsg || errorMsg === null || errorMsg === undefined || errorMsg.trim() === '') {
                            errorMsg = '导入失败,请检查文件格式或网络连接,或联系管理员';
                        }
                        // 优化网络错误信息
                        if (errorMsg.includes('SocketException') || errorMsg.includes('timeout') || errorMsg.includes('Network Error')) {
                            errorMsg = '导入失败:网络连接异常,请检查网络连接或稍后重试';
                        }
                        console.log('最终显示的错误信息:', errorMsg); // 打印最终显示的错误信息到console
                        vc.toast(errorMsg, 10000);
                        // 关闭模态框
                        $('#importPurchaseApplyModel').modal('hide');
                    });
            },
            checkFileType: function(fileType) {
                const acceptTypes = ['xlsx', 'xls'];
                for (var i = 0; i < acceptTypes.length; i++) {
                    if (fileType === acceptTypes[i]) {
                        return true;
                    }
                }
                return false;
            }
        }
    });
})(window.vc);
public/pages/common/purchaseApplyManage/purchaseApplyManage.html
@@ -85,8 +85,11 @@
                                <vc:i18n name="采购申请" namespace="purchaseApplyManage"></vc:i18n>
                            </h5>
                            <div class="ibox-tools" style="top:10px;">
                                <button type="button" class="btn btn-primary btn-sm"
                                        v-on:click="_openAddPurchaseApplyModal()">
                                <button type="button" class="btn btn-primary btn-sm" v-on:click="_importExcel()">
                                    <i class="fa fa-sign-in"></i>
                                    <vc:i18n name="导入" namespace="purchaseApplyManage"></vc:i18n>
                                </button>
                                <button type="button" class="btn btn-primary btn-sm" v-on:click="_openAddPurchaseApplyModal()">
                                    <i class="fa fa-plus"></i>
                                    <vc:i18n name="采购" namespace="purchaseApplyManage"></vc:i18n>
                                </button>
@@ -212,4 +215,5 @@
    <vc:create path="common/viewImage"></vc:create>
    <vc:create path="common/editPurchaseApply"></vc:create>
    <vc:create path="common/deletePurchaseApply"></vc:create>
    <vc:create path="common/importPurchaseApply"></vc:create>
</div>
public/pages/common/purchaseApplyManage/purchaseApplyManage.js
@@ -188,6 +188,10 @@
            _queryInspectionPlanMethod: function () {
                $that._listPurchaseApplys(DEFAULT_PAGE, DEFAULT_ROWS);
            },
            //导入
            _importExcel: function () {
                vc.emit('importPurchaseApply', 'openImportPurchaseApplyModal', {});
            },
            //导出
            _exportExcel: function () {
                // vc.jumpToPage('/callComponent/exportReportFee/exportData?pagePath=purchaseApplyManage&' + vc.objToGetParam($that.purchaseApplyManageInfo.conditions));