| | |
| | | <div class="inner" ref="wraper"> |
| | | <a-spin class="" :spinning="spinning" tip="拼命加载中..."> |
| | | <a-card> |
| | | <advance-table ref="table" class="doc-center-table" :data-source="dataSource" :columns="columns" |
| | | :loading="loading" title="" row-key="id" @search="onSearch" @refresh="onRefresh" @reset="onReset" |
| | | :format-conditions="true" :scroll="{ x: 400, y }" :pagination="{ |
| | | <advance-table |
| | | ref="table" |
| | | class="doc-center-table" |
| | | :data-source="dataSource" |
| | | :columns="columns" |
| | | :loading="loading" |
| | | title="" |
| | | row-key="id" |
| | | @search="onSearch" |
| | | @refresh="onRefresh" |
| | | @reset="onReset" |
| | | :format-conditions="true" |
| | | :scroll="{ x: 400, y }" |
| | | :pagination="{ |
| | | current: pageCurr, |
| | | pageSize: pageSize, |
| | | total: total, |
| | |
| | | `第 ${range[0]}-${range[1]} 条,总计 ${total} 条`, |
| | | onChange: onPageChange, |
| | | onShowSizeChange: onSizeChange, |
| | | }"> |
| | | }" |
| | | :rowClassName="rowClassFn" |
| | | > |
| | | <template slot="dataIndex" slot-scope="{ index }"> |
| | | {{ index + 1 }} |
| | | </template> |
| | | <template slot="title"> |
| | | <a-space class="operator"> |
| | | <span class="title">产品中心</span> |
| | | <a-button v-if="canUploadBom" type="primary" @click="uploadBom">新增</a-button> |
| | | <a-button v-if="canUploadBom" type="primary" @click="uploadBom" |
| | | >新增</a-button |
| | | > |
| | | <a-button type="primary" @click="prodDiff">产品比较</a-button> |
| | | <a-button type="primary" @click="ownerDownloadLog" |
| | | >我的锁定记录</a-button |
| | | > |
| | | </a-space> |
| | | </template> |
| | | <template slot="enabled" slot-scope="{ record }"> |
| | | {{ record.enabled == -1 ? "是" : "否" }} |
| | | </template> |
| | | <template slot="enabled1" slot-scope="{ record }"> |
| | | {{ record.enabled == 1 ? "可用" : "不可用" }} |
| | | </template> |
| | | <template slot="isNormal" slot-scope="{ record }"> |
| | | {{ record.customCode == "" ? "是" : "否" }} |
| | |
| | | <a @click="upload(record)">上传软件</a> |
| | | <a-divider type="vertical"></a-divider> |
| | | </template> --> |
| | | <a @click="viewLog(record)">日志</a> |
| | | <a @click="viewLog(record)">状态日志</a> |
| | | <a-divider type="vertical"></a-divider> |
| | | <a @click="goDetails(record)">详情</a> |
| | | <a-divider type="vertical"></a-divider> |
| | | <a-popover title="" trigger="hover"> |
| | | <a-space class="btn-grp" direction="vertical" slot="content"> |
| | | <a-button :disabled="record.version == -1" type="primary" @click="edit(record)">编辑</a-button> |
| | | <a-button v-if="canDownloadBom" :disabled="record.version == -1" type="primary" |
| | | @click="checkLock(record)">下载</a-button> |
| | | <a-button type="primary" v-if="canUploadBom" :disabled="record.version == -1" |
| | | @click="showCustom(record)">定制</a-button> |
| | | <a-button type="primary" v-if="canFeedback" :disabled="record.version == -1" |
| | | @click="showFeedback(record)">反馈</a-button> |
| | | <a-button type="primary" v-if="record.ecrList.length > 0" @click="showEcrlist(record)">ecr记录</a-button> |
| | | <!-- TODO --> |
| | | <a-button |
| | | v-if="isTester && record.enabled != 1" |
| | | type="primary" |
| | | @click="unLock(record)" |
| | | >解锁</a-button |
| | | > |
| | | <a-button type="primary" @click="downloadLog(record)" |
| | | >下载日志</a-button |
| | | > |
| | | <a-button |
| | | :disabled="record.version != 1" |
| | | type="primary" |
| | | @click="edit(record)" |
| | | >编辑</a-button |
| | | > |
| | | <a-button |
| | | v-if="canDownloadBom" |
| | | :disabled="record.version == -1 && !isTester" |
| | | type="primary" |
| | | @click="checkLock(record)" |
| | | >下载</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if="canUploadBom" |
| | | :disabled="record.version == -1" |
| | | @click="showCustom(record)" |
| | | >定制</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if="canFeedback" |
| | | @click="showFeedback(record)" |
| | | >反馈</a-button |
| | | > |
| | | <a-badge |
| | | :count="record.ecrList.length" |
| | | showZero |
| | | :number-style="{ |
| | | backgroundColor: record.ecrList.length > 0 ? '#090' : '#900', |
| | | }" |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | @click="showEcrlist(record)" |
| | | >ecr记录</a-button |
| | | > |
| | | </a-badge> |
| | | </a-space> |
| | | <a>更多</a> |
| | | </a-popover> |
| | |
| | | </a-spin> |
| | | </div> |
| | | <!-- 上传软件 --> |
| | | <a-modal :visible="uploadShow" :footer="null" :width="500" title="上传软件" :destroyOnClose="true" :maskClosable="false" |
| | | @cancel="uploadCancel"> |
| | | <a-modal |
| | | :visible="uploadShow" |
| | | :footer="null" |
| | | :width="500" |
| | | title="上传软件" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="uploadCancel" |
| | | > |
| | | <div class=""> |
| | | <a-row class="title"> |
| | | <a-col :span="6" class="text-right"> |
| | |
| | | </a-row> |
| | | <a-row class="upload"> |
| | | <a-col :span="15" :offset="7"> |
| | | <a-upload :before-upload="beforeUpload" @change="uploadChange" accept=".zip"> |
| | | <a-upload |
| | | :before-upload="beforeUpload" |
| | | @change="uploadChange" |
| | | accept=".zip" |
| | | > |
| | | <a-button type="primary">上传软件</a-button> |
| | | </a-upload> |
| | | </a-col> |
| | | </a-row> |
| | | <a-form-model ref="formRef" name="advanced_search" class="ant-advanced-search-form" :model="info" :rules="rules"> |
| | | <a-form-model |
| | | ref="formRef" |
| | | name="advanced_search" |
| | | class="ant-advanced-search-form" |
| | | :model="info" |
| | | :rules="rules" |
| | | > |
| | | <a-row> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="审核人" :labelCol="{ span: 6 }" :wrapperCol="{ span: 15, offset: 1 }" |
| | | prop="nextUser"> |
| | | <a-select show-search v-model="info.nextUser" placeholder="请选择审核人"> |
| | | <a-select-option v-for="(item, key) in userList" :key="'key' + key" :value="item.id" :title="item.name"> |
| | | <a-form-model-item |
| | | label="审核人" |
| | | :labelCol="{ span: 6 }" |
| | | :wrapperCol="{ span: 15, offset: 1 }" |
| | | prop="nextUser" |
| | | > |
| | | <a-select |
| | | show-search |
| | | v-model="info.nextUser" |
| | | placeholder="请选择审核人" |
| | | > |
| | | <a-select-option |
| | | v-for="(item, key) in userList" |
| | | :key="'key' + key" |
| | | :value="item.id" |
| | | :title="item.name" |
| | | > |
| | | {{ item.name }} |
| | | </a-select-option> |
| | | </a-select> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | <a-col :span="24"> |
| | | <a-form-model-item label="工单描述" :labelCol="{ span: 6 }" :wrapperCol="{ span: 15, offset: 1 }" |
| | | prop="description"> |
| | | <a-textarea placeholder="请输入工单描述" v-model="info.description" :rows="4" /> |
| | | <a-form-model-item |
| | | label="工单描述" |
| | | :labelCol="{ span: 6 }" |
| | | :wrapperCol="{ span: 15, offset: 1 }" |
| | | prop="description" |
| | | > |
| | | <a-textarea |
| | | placeholder="请输入工单描述" |
| | | v-model="info.description" |
| | | :rows="4" |
| | | /> |
| | | </a-form-model-item> |
| | | </a-col> |
| | | </a-row> |
| | |
| | | </div> |
| | | </a-modal> |
| | | <!-- 编辑产品 --> |
| | | <a-modal :visible="editShow" :footer="null" :width="1200" title="修改产品替换件信息" :destroyOnClose="true" |
| | | :maskClosable="false" @cancel="cancel"> |
| | | <a-modal |
| | | :visible="editShow" |
| | | :footer="null" |
| | | :width="1200" |
| | | title="修改产品替换件信息" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="cancel" |
| | | > |
| | | <change-parts :parent-data="editObj" @close="cancel"></change-parts> |
| | | </a-modal> |
| | | <!-- 上传bom --> |
| | | <a-modal :visible="bomUploadShow" :width="760" title="上传产品BOM" :destroyOnClose="true" :maskClosable="false" |
| | | @cancel="bomUploadCancel" @ok="bomUploadOk"> |
| | | <a-modal |
| | | :visible="bomUploadShow" |
| | | :width="760" |
| | | title="上传产品BOM" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="bomUploadCancel" |
| | | @ok="bomUploadOk" |
| | | > |
| | | <a-row class="upload" type="flex"> |
| | | <a-col flex="7em"></a-col> |
| | | <a-col flex="1"> |
| | | <a-upload :before-upload="beforeUpload" @change="uploadChange" accept=".zip"> |
| | | <a-upload |
| | | :before-upload="beforeUpload" |
| | | @change="uploadChange" |
| | | accept=".zip" |
| | | > |
| | | <a-button type="primary">上传BOM</a-button> |
| | | </a-upload> |
| | | </a-col> |
| | |
| | | <a-row type="flex"> |
| | | <a-col class="label" flex="7em"><span>基于产品</span></a-col> |
| | | <a-col flex="1"> |
| | | <a-select class="from" show-search allowClear :filterOption="prodFilter" v-model="fromProd" |
| | | placeholder="请选择是从哪款产品升级来的"> |
| | | <a-select-option v-for="(item, key) in prodList" :key="'prod_' + key" :value="item.id" :title="item.name"> |
| | | <a-select |
| | | class="from" |
| | | show-search |
| | | allowClear |
| | | :filterOption="prodFilter" |
| | | v-model="fromProd" |
| | | placeholder="请选择是从哪款产品升级来的" |
| | | > |
| | | <a-select-option |
| | | v-for="(item, key) in prodList" |
| | | :key="'prod_' + key" |
| | | :value="item.id" |
| | | :title="item.name" |
| | | > |
| | | {{ item.parentName }} ({{ item.parentCode }}) |
| | | {{ item.customCode }} |
| | | </a-select-option> |
| | |
| | | </a-row> |
| | | </a-modal> |
| | | <!-- 解析Bom --> |
| | | <a-modal :visible="prodUploadShow" :footer="null" :width="960" title="上传产品BOM" :destroyOnClose="true" |
| | | :maskClosable="false" @cancel="prodUploadCancel"> |
| | | <a-modal |
| | | :visible="prodUploadShow" |
| | | :footer="null" |
| | | :width="960" |
| | | title="上传产品BOM" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="prodUploadCancel" |
| | | > |
| | | <a-tabs type="card" tabPosition="left"> |
| | | <a-tab-pane key="1" tab="清单"> |
| | | <draw-upload class="bom-list" :list="resList" :y="320" :no-footer="true"></draw-upload> |
| | | <draw-upload |
| | | class="bom-list" |
| | | :list="resList" |
| | | :y="320" |
| | | :no-footer="true" |
| | | ></draw-upload> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="2" tab="差异"> |
| | | <diff-list :list="diffData"></diff-list> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="3" :tab="abLabel"> |
| | | <a-table ref="aTable" size="small" :scroll="{ y: 700 }" bordered :columns="abTbl.columns" |
| | | :data-source="abTbl.dataSource" :pagination="false" rowKey="subCode"></a-table> |
| | | <a-table |
| | | ref="aTable" |
| | | size="small" |
| | | :scroll="{ y: 700 }" |
| | | bordered |
| | | :columns="abTbl.columns" |
| | | :data-source="abTbl.dataSource" |
| | | :pagination="false" |
| | | rowKey="subCode" |
| | | ></a-table> |
| | | <div style="text-align: right; padding: 8px"> |
| | | <a-button @click="abTbl.ignore = true" :type="abState ? 'danger' : 'primary'" |
| | | :icon="abState ? 'question' : 'check'">{{ abState ? "未确认" : "已确认" }}</a-button> |
| | | <a-button |
| | | @click="abTbl.ignore = true" |
| | | :type="abState ? 'danger' : 'primary'" |
| | | :icon="abState ? 'question' : 'check'" |
| | | >{{ abState ? "未确认" : "已确认" }}</a-button |
| | | > |
| | | </div> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="4" :tab="errorLabel"> |
| | | <a-table ref="aTable" size="small" :scroll="{ y: 700 }" bordered :columns="errorTbl.columns" |
| | | :data-source="errorTbl.dataSource" :pagination="false" rowKey="subCode"></a-table> |
| | | <a-table |
| | | ref="aTable" |
| | | size="small" |
| | | :scroll="{ y: 700 }" |
| | | bordered |
| | | :columns="errorTbl.columns" |
| | | :data-source="errorTbl.dataSource" |
| | | :pagination="false" |
| | | rowKey="subCode" |
| | | ></a-table> |
| | | </a-tab-pane> |
| | | </a-tabs> |
| | | <prod-upload class="mt8" @ok="submit" @cancel="prodUploadCancel"></prod-upload> |
| | | <prod-upload |
| | | class="mt8" |
| | | @ok="submit" |
| | | @cancel="prodUploadCancel" |
| | | ></prod-upload> |
| | | </a-modal> |
| | | <!-- 定制 --> |
| | | <a-modal :visible="customShow" :footer="null" :width="800" title="产品定制" :destroyOnClose="true" :maskClosable="false" |
| | | @cancel="customCancel"> |
| | | <prod-upload class="mt8" :prod-info="customProd" @ok="custom" @cancel="customCancel"></prod-upload> |
| | | <a-modal |
| | | :visible="customShow" |
| | | :footer="null" |
| | | :width="800" |
| | | title="产品定制" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="customCancel" |
| | | > |
| | | <prod-upload |
| | | class="mt8" |
| | | :prod-info="customProd" |
| | | @ok="custom" |
| | | @cancel="customCancel" |
| | | ></prod-upload> |
| | | </a-modal> |
| | | <!-- 日志 --> |
| | | <a-modal :visible="logVisible" :footer="null" :width="800" title="操作日志" :destroyOnClose="true" @cancel="logCancel"> |
| | | <a-modal |
| | | :visible="logVisible" |
| | | :footer="null" |
| | | :width="800" |
| | | title="操作日志" |
| | | :destroyOnClose="true" |
| | | @cancel="logCancel" |
| | | > |
| | | <div class="log-content"> |
| | | <a-timeline v-if="logList.length"> |
| | | <a-timeline-item v-for="(item, idx) in logList" :key="'log_' + idx" |
| | | :color="item.lockFlag == 1 ? 'red' : 'green'"> |
| | | <a-timeline-item |
| | | v-for="(item, idx) in logList" |
| | | :key="'log_' + idx" |
| | | :color="item.lockFlag == 1 ? 'red' : 'green'" |
| | | > |
| | | <div> |
| | | <span class="user">{{ item.owner }}</span> 在 |
| | | <span class="time">{{ item.createTime }}</span> |
| | | {{ item.lockFlag ? "锁定" : "激活" }}了版本 |
| | | {{ |
| | | { "-1": "上传", "0": "激活", "1": "锁定" }[item.lockFlag] |
| | | }}了版本 |
| | | <span class="version">{{ item.versionTime }}</span> |
| | | </div> |
| | | <div>操作原因: {{ item.reason ? item.reason : "无" }}</div> |
| | |
| | | </div> |
| | | </a-modal> |
| | | <!-- 锁定清单 --> |
| | | <a-modal :visible="lockListVisible" :width="800" title="下载提示 (有锁定文件)" :destroyOnClose="true" @cancel="lockListCancel" |
| | | @ok="lockListOk"> |
| | | <a-modal |
| | | :visible="lockListVisible" |
| | | :width="800" |
| | | title="下载提示 (有锁定文件)" |
| | | :destroyOnClose="true" |
| | | @cancel="lockListCancel" |
| | | @ok="lockListOk" |
| | | > |
| | | <!-- bom清单中存在锁定图纸的物料 --> |
| | | <template v-if="bomLockList.length"> |
| | | <div class="table-title">bom清单中存在锁定图纸的物料</div> |
| | | <a-table size="small" :scroll="{ y: 150 }" bordered :columns="bomLockColumns" :data-source="bomLockList" |
| | | :pagination="false" :expandRowByClick="true" :row-key="(record, index) => index"></a-table> |
| | | <a-table |
| | | size="small" |
| | | :scroll="{ y: 150 }" |
| | | bordered |
| | | :columns="bomLockColumns" |
| | | :data-source="bomLockList" |
| | | :pagination="false" |
| | | :expandRowByClick="true" |
| | | :row-key="(record, index) => index" |
| | | ></a-table> |
| | | </template> |
| | | <!-- 其他附件中存在锁定文件 --> |
| | | <template v-if="otherLockList.length"> |
| | | <div class="table-title">其他附件中存在锁定文件</div> |
| | | <a-table size="small" :scroll="{ y: 150 }" bordered :columns="otherLockColumns" :data-source="otherLockList" |
| | | :pagination="false" :expandRowByClick="true" :row-key="(record, index) => index"></a-table> |
| | | <a-table |
| | | size="small" |
| | | :scroll="{ y: 150 }" |
| | | bordered |
| | | :columns="otherLockColumns" |
| | | :data-source="otherLockList" |
| | | :pagination="false" |
| | | :expandRowByClick="true" |
| | | :row-key="(record, index) => index" |
| | | ></a-table> |
| | | </template> |
| | | </a-modal> |
| | | <a-modal :visible="feedbackShow" :width="800" title="问题反馈" :destroyOnClose="true" :footer="false" |
| | | @cancel="feedbackCancel"> |
| | | <feedback-form :prod-data="customProd" @cancel="feedbackCancel" @ok="feedbackOk"></feedback-form> |
| | | <a-modal |
| | | :visible="feedbackShow" |
| | | :width="800" |
| | | title="问题反馈" |
| | | :destroyOnClose="true" |
| | | :footer="false" |
| | | @cancel="feedbackCancel" |
| | | > |
| | | <feedback-form |
| | | :prod-data="customProd" |
| | | @cancel="feedbackCancel" |
| | | @ok="feedbackOk" |
| | | ></feedback-form> |
| | | </a-modal> |
| | | <!-- ecr列表 --> |
| | | <a-modal :visible="ecrListVisible" :width="800" title="ecr记录" :destroyOnClose="true" @cancel="ecrListCancel"> |
| | | <a-modal |
| | | :visible="ecrListVisible" |
| | | :width="800" |
| | | title="ecr记录" |
| | | :destroyOnClose="true" |
| | | @cancel="ecrListCancel" |
| | | > |
| | | <div class="footer" slot="footer"> |
| | | <a-button type="primary" @click="ecrListCancel">关闭</a-button> |
| | | </div> |
| | | <div class="ecr-content"> |
| | | <a-table ref="aTable" size="small" :scroll="{ y: 700 }" bordered :columns="ecrColumns" :data-source="ecrList" |
| | | :pagination="false" rowKey="id"> |
| | | <a-table |
| | | ref="aTable" |
| | | size="small" |
| | | :scroll="{ y: 700 }" |
| | | bordered |
| | | :columns="ecrColumns" |
| | | :data-source="ecrList" |
| | | :pagination="false" |
| | | rowKey="id" |
| | | > |
| | | <template slot="changeDesc" slot-scope="text, record"> |
| | | <a-tooltip placement="topLeft"> |
| | | <template slot="title"> |
| | |
| | | </a-table> |
| | | </div> |
| | | </a-modal> |
| | | <a-modal |
| | | :visible="errorVisible" |
| | | :footer="null" |
| | | :width="1200" |
| | | title="名称或型号命名不规范" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="errorVisible = false" |
| | | > |
| | | <a-table |
| | | ref="aTable" |
| | | size="small" |
| | | :scroll="{ y: 500 }" |
| | | bordered |
| | | :columns="errorTbl2.columns" |
| | | :data-source="errorTbl2.dataSource" |
| | | :pagination="false" |
| | | rowKey="num" |
| | | ></a-table> |
| | | </a-modal> |
| | | <!-- 操作原因 --> |
| | | <a-modal |
| | | :visible="reasonVisible" |
| | | :width="460" |
| | | title="操作原因" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | | @cancel="reasonCancel" |
| | | @ok="reasonOk" |
| | | > |
| | | <a-form-model-item ref="name" label="操作原因"> |
| | | <a-input |
| | | type="textarea" |
| | | v-model="reason" |
| | | placeHolder="请输入操作原因" |
| | | /> |
| | | </a-form-model-item> |
| | | </a-modal> |
| | | <download-reason |
| | | :reason-visible.sync="downloadReasonVisible" |
| | | v-if="downloadReasonVisible" |
| | | @ok="downloadReasonOk" |
| | | ></download-reason> |
| | | <download-logs |
| | | :visible.sync="downloadlogVisible" |
| | | v-if="downloadlogVisible" |
| | | :type="12" |
| | | :oprate-info="oprateInfo" |
| | | ></download-logs> |
| | | <a-modal |
| | | :visible="ownerLogVisible" |
| | | title="我的下载记录" |
| | | width="100%" |
| | | :destroyOnClose="true" |
| | | @cancel="ownerLogClose" |
| | | wrapClassName="full-modal" |
| | | > |
| | | <owner-download></owner-download> |
| | | <template v-slot:footer> |
| | | <a-button @click="ownerLogClose">关闭</a-button> |
| | | </template> |
| | | </a-modal> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import ChangeParts from "./changeParts"; |
| | | import ProdUpload from "./prodUpload"; |
| | | import DrawUpload from "@/pages/components/drawUpload"; |
| | | import DownloadReason from "@/pages/components/downloadReason"; |
| | | import DownloadLogs from "@/pages/components/downloadLogs"; |
| | | |
| | | import getWebUrl from "@/assets/js/tools/getWebUrl"; |
| | | import { |
| | |
| | | getAllProducts, |
| | | getLogList, |
| | | getLockedList, |
| | | setpHistoryEnable, |
| | | } from "./apis"; |
| | | |
| | | import { |
| | | searchDefaultMailUser, |
| | | sendMail, |
| | | } from "../../components/emailCard/apis"; |
| | | import { getUserList } from "../../permission/apis"; |
| | | |
| | | import { getRoleUser } from "@/pages/user/apis"; |
| | | import { submitFeedback } from "@/pages/workplace/apis"; |
| | | import { productSoftwareSubmit } from "../software/apis"; |
| | | import { zipParse } from "@/pages/workplace/myDraw/apis"; |
| | |
| | | import createWs from "@/assets/js/websocket"; |
| | | import DiffList from "@/pages/components/diffList"; |
| | | import FeedbackForm from "../components/feedbackForm.vue"; |
| | | import OwnerDownload from "../components/ownerDownload"; |
| | | const WSMixin = createWs("product"); |
| | | |
| | | export default { |
| | |
| | | dataIndex: "changeDescription", |
| | | align: "center", |
| | | ellipsis: true, |
| | | scopedSlots: { customRender: 'changeDesc' } |
| | | scopedSlots: { customRender: "changeDesc" }, |
| | | }, |
| | | ]; |
| | | return { |
| | | ownerLogVisible: false, |
| | | reason: "", |
| | | reasonVisible: false, |
| | | oprateInfo: "", |
| | | downloadlogVisible: false, |
| | | tester: [], |
| | | downloadReasonVisible: false, |
| | | curObj: null, |
| | | errorVisible: false, |
| | | ecrColumns, |
| | | feedbackShow: false, |
| | | lockListVisible: false, |
| | |
| | | }, |
| | | prodData: {}, |
| | | userList: [], |
| | | userListAll: [], |
| | | mailList: [], |
| | | file: null, |
| | | // title: "", |
| | | fileUrl: "", |
| | |
| | | width: 100, |
| | | scopedSlots: { customRender: "isNormal" }, |
| | | }, |
| | | { |
| | | title: "待复核", |
| | | dataIndex: "enabled", |
| | | dataType: "boolean", |
| | | align: "center", |
| | | searchAble: true, |
| | | width: 100, |
| | | scopedSlots: { customRender: "enabled" }, |
| | | }, |
| | | { |
| | | title: "是否可用", |
| | | dataIndex: "enabled1", |
| | | dataType: "boolean", |
| | | align: "center", |
| | | searchAble: false, |
| | | width: 100, |
| | | scopedSlots: { customRender: "enabled1" }, |
| | | }, |
| | | // { |
| | | // title: "创建时间", |
| | | // dataIndex: "createTime", |
| | |
| | | columns: errorColumns, |
| | | dataSource: [], |
| | | }, |
| | | errorTbl2: { |
| | | columns: [ |
| | | { |
| | | title: "子件编码", |
| | | dataIndex: "subCode", |
| | | align: "center", |
| | | }, |
| | | { |
| | | title: "子件型号", |
| | | dataIndex: "subModel", |
| | | align: "center", |
| | | }, |
| | | { |
| | | title: "子件名称", |
| | | dataIndex: "subName", |
| | | align: "center", |
| | | }, |
| | | { |
| | | title: "问题描述", |
| | | dataIndex: "irregularDesc", |
| | | align: "center", |
| | | }, |
| | | ], |
| | | dataSource: [], |
| | | }, |
| | | bomLockColumns: [ |
| | | { |
| | | title: "子件名称", |
| | |
| | | DrawUpload, |
| | | DiffList, |
| | | FeedbackForm, |
| | | DownloadReason, |
| | | DownloadLogs, |
| | | OwnerDownload, |
| | | }, |
| | | methods: { |
| | | rowClassFn(record) { |
| | | let classList = []; |
| | | if (record.enabled == -1) { |
| | | classList.push("locked"); |
| | | } |
| | | if (record.enabled == 0) { |
| | | classList.push("unable"); |
| | | } |
| | | return classList; |
| | | }, |
| | | unLock(obj) { |
| | | this.curObj = obj; |
| | | this.reasonVisible = true; |
| | | }, |
| | | reasonCancel() { |
| | | this.reasonVisible = false; |
| | | }, |
| | | reasonOk() { |
| | | let { |
| | | curObj: { |
| | | customCode, |
| | | parentCode, |
| | | version, |
| | | versionTime, |
| | | enabled: lockFlagNow, |
| | | }, |
| | | reason, |
| | | } = this; |
| | | let enabled = 1; |
| | | setpHistoryEnable({ |
| | | customCode, |
| | | parentCode, |
| | | enabled, |
| | | version, |
| | | reason, |
| | | versionTime, |
| | | }).then((res) => { |
| | | let { code, data } = res.data; |
| | | if (code && data) { |
| | | this.$message.success("操作成功"); |
| | | this.sendMessage(); |
| | | this.reasonVisible = false; |
| | | // 如果是测试人员解锁确认 则自动发送邮件 |
| | | if (lockFlagNow == -1 && this.isTester) { |
| | | this.sendEmail(); |
| | | } |
| | | } else { |
| | | this.$message.error("操作失败"); |
| | | } |
| | | }); |
| | | }, |
| | | sendEmail() { |
| | | let { title, content } = this.handleEmailShow(this.curObj, true); |
| | | let params = { mailList: this.mailList, title, content }; |
| | | sendMail(params); |
| | | }, |
| | | searchAllUserList() { |
| | | getUserList() |
| | | .then((res) => { |
| | | let rs = res.data; |
| | | if (rs.code && rs.data) { |
| | | this.userListAll = rs.data2; |
| | | this.searchDefaultMailUser(); |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | searchDefaultMailUser() { |
| | | // type为3 |
| | | let type = 3; |
| | | searchDefaultMailUser(type).then((res) => { |
| | | let rs = res.data; |
| | | let data = []; |
| | | if (rs.code === 1) { |
| | | data = rs.data.map((item) => { |
| | | return item.user; |
| | | }); |
| | | } |
| | | this.mailList = this.userListAll |
| | | .filter((o) => data.includes(o.name) && o.mail) |
| | | .map((item) => { |
| | | return item.mail; |
| | | }); |
| | | }); |
| | | }, |
| | | handleEmailShow(record, get) { |
| | | let title = |
| | | "[产品发布记录]" + record.parentModel + " 版本:" + record.versionTime; |
| | | let content = []; |
| | | content.push("物料编码: " + record.parentCode); |
| | | content.push("物料名称: " + record.parentName); |
| | | content.push("规格型号: " + record.parentModel); |
| | | content.push("标准机型: " + (!record.customCode ? "是" : "否")); |
| | | content.push("定制单号: " + (record.customCode || "无")); |
| | | content.push("版本时间: " + record.versionTime); |
| | | if (get) { |
| | | return { |
| | | title, |
| | | content: content.join("\n"), |
| | | }; |
| | | } |
| | | }, |
| | | onSearch(conditions, searchOptions) { |
| | | // console.log(conditions); |
| | | // console.log(searchOptions); |
| | |
| | | let data = []; |
| | | let total = 0; |
| | | if (res.code && res.data) { |
| | | data = res.data2.list.map(v => { |
| | | if ('' != v.customCode) { |
| | | data = res.data2.list.map((v) => { |
| | | if ("" != v.customCode) { |
| | | v.ecrList = []; |
| | | } |
| | | return v; |
| | |
| | | } |
| | | }, |
| | | edit(obj) { |
| | | console.log(obj, 99); |
| | | // console.log(obj, 99); |
| | | this.editObj = obj; |
| | | this.editShow = true; |
| | | }, |
| | | checkLock(obj) { |
| | | let loading = this.$layer.loading({ shade: true }); |
| | | getLockedList(obj.id).then((res) => { |
| | | const { code, data, data2, data3 } = res.data; |
| | | this.$layer.close(loading); |
| | | if (code) { |
| | | if (data) { |
| | | // 有锁定 |
| | |
| | | this.lockListVisible = true; |
| | | } else { |
| | | // 没有锁定 |
| | | this.download(obj); |
| | | this.showReason(obj); |
| | | } |
| | | } else { |
| | | this.$message.error("查询锁定清单出错"); |
| | |
| | | }, |
| | | lockListOk() { |
| | | this.lockListVisible = false; |
| | | this.download(this.currentObj); |
| | | this.showReason(this.currentObj); |
| | | }, |
| | | download(obj) { |
| | | const { id, version } = obj; |
| | | downloadBom(id, version).then((res) => { |
| | | showReason(obj) { |
| | | this.curObj = obj; |
| | | this.downloadReasonVisible = true; |
| | | }, |
| | | downloadReasonOk(reason) { |
| | | this.download(reason); |
| | | }, |
| | | download(reason) { |
| | | const { id, version, parentCode, customCode } = this.curObj; |
| | | let oprateInfo = parentCode + "_" + customCode; |
| | | let loading = this.$layer.loading({ shade: true }); |
| | | downloadBom(id, version, reason, oprateInfo).then((res) => { |
| | | // console.log(res, "==========="); |
| | | this.$layer.close(loading); |
| | | let { headers, data, status } = res; |
| | | if (200 == status && data) { |
| | | let url = window.URL.createObjectURL(data); |
| | | const matchRes = /filename=(.*)/.exec(headers["content-disposition"]); |
| | | const fileName = matchRes ? matchRes[1].trim() : "未知文件名.zip"; |
| | | const fileName = matchRes |
| | | ? decodeURI(matchRes[1].trim()) |
| | | : "未知文件名.zip"; |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | link.href = url; |
| | |
| | | const formData = new FormData(); |
| | | formData.append("multipartFile", this.file); |
| | | formData.append("mainDTOString", JSON.stringify(obj)); |
| | | |
| | | let loading = this.$layer.loading({ shade: true }); |
| | | productSoftwareSubmit(formData) |
| | | .then((res) => { |
| | | // this.$layer.close(loadinobjobj |
| | | this.$layer.close(loading); |
| | | let rs = res.data; |
| | | if (rs.code == 1 && rs.data) { |
| | | this.resList = rs.data2; |
| | |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | // this.$layer.close(loading); |
| | | this.$layer.close(loading); |
| | | console.log(error); |
| | | }); |
| | | } |
| | |
| | | } |
| | | const { pageCurr, pageSize, conditions, columns } = this; |
| | | let params = {}; |
| | | let col, index; |
| | | Object.keys(conditions).forEach((v) => { |
| | | switch (v) { |
| | | case "isNormal": |
| | | if (conditions[v]) { |
| | | params["customCode"] = ""; |
| | | columns.forEach((val) => { |
| | | columns.forEach((val, idx) => { |
| | | if (val.dataIndex == "customCode") { |
| | | val.search.value = ""; |
| | | col = { ...val, search: { value: "", backup: "" } }; |
| | | index = idx; |
| | | } |
| | | }); |
| | | this.$set(this.columns, index, col); |
| | | } |
| | | break; |
| | | case "customCode": |
| | | if (params["customCode"] == undefined) { |
| | | params[v] = conditions[v]; |
| | | } |
| | | break; |
| | | case "enabled": |
| | | if (conditions[v]) { |
| | | params[v] = -1; |
| | | } |
| | | break; |
| | | default: |
| | |
| | | parentName, |
| | | }; |
| | | addProduct(param).then((res) => { |
| | | const { code, msg } = res.data; |
| | | const { code, data, msg } = res.data; |
| | | this.$layer.close(loading); |
| | | if (code) { |
| | | if (code && data) { |
| | | this.$message.success(msg); |
| | | this.prodUploadShow = false; |
| | | } else { |
| | |
| | | } = data; |
| | | let loading = this.$layer.loading({ shade: true }); |
| | | const formData = new FormData(); |
| | | formData.append("multipartFile", multipartFile); |
| | | multipartFile.forEach((v) => { |
| | | formData.append("multipartFileList", v); |
| | | }); |
| | | formData.append( |
| | | "feedbackJson", |
| | | JSON.stringify({ |
| | |
| | | subVersion, |
| | | }) |
| | | ); |
| | | |
| | | submitFeedback(formData).then((res) => { |
| | | let { code, data } = res.data; |
| | | if (code && data) { |
| | |
| | | parentModel, |
| | | parentName, |
| | | }; |
| | | let loading = this.$layer.loading({ shade: true }); |
| | | addProduct(param).then((res) => { |
| | | const { code, msg } = res.data; |
| | | if (code) { |
| | | this.$message.success(msg); |
| | | this.$layer.close(loading); |
| | | this.customShow = false; |
| | | } else { |
| | | this.$message.error(msg); |
| | | this.$layer.close(loading); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | this.prodUploadShow = true; |
| | | this.$message.success("解析成功"); |
| | | } else { |
| | | this.$message.error(msg); |
| | | if (msg == "名称或型号命名不规范") { |
| | | this.errorTbl2.dataSource = data2; |
| | | this.errorVisible = true; |
| | | } else { |
| | | this.$message.error(msg); |
| | | } |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | |
| | | return reg.test(txt); |
| | | }, |
| | | viewLog(obj) { |
| | | console.log(obj); |
| | | // console.log(obj); |
| | | const { parentCode, customCode } = obj; |
| | | getLogList({ parentCode, customCode }).then((res) => { |
| | | const { code, data } = res.data; |
| | |
| | | }, |
| | | ecrListCancel() { |
| | | this.ecrListVisible = false; |
| | | } |
| | | }, |
| | | getRoleUser() { |
| | | getRoleUser(1) |
| | | .then((res) => { |
| | | let { code, data, data2 } = res.data; |
| | | let list = []; |
| | | if (code && data) { |
| | | // console.log(data); |
| | | list = data2.map((v) => v.name); |
| | | } |
| | | this.tester = list; |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | downloadLog(record) { |
| | | // console.log(record); |
| | | let { customCode, parentCode } = record; |
| | | this.oprateInfo = parentCode + "_" + customCode; |
| | | this.downloadlogVisible = true; |
| | | }, |
| | | ownerDownloadLog() { |
| | | this.ownerLogVisible = true; |
| | | }, |
| | | ownerLogClose() { |
| | | this.ownerLogVisible = false; |
| | | }, |
| | | }, |
| | | watch: { |
| | | update(n) { |
| | |
| | | "projectManagerList", |
| | | "generalManagerList", |
| | | "permits", |
| | | "user", |
| | | ]), |
| | | ...mapGetters("setting", ["affixed"]), |
| | | canUploadBom() { |
| | |
| | | |
| | | return result; |
| | | }, |
| | | isTester() { |
| | | return this.tester.some((v) => v == this.user.name); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.searchAllUserList(); |
| | | this.getRoleUser(); |
| | | this.getUserByRoleId(); |
| | | this.sendMessage(); |
| | | this.getAllProducts(); |
| | |
| | | .modal-footer { |
| | | text-align: right; |
| | | |
| | | button+button { |
| | | button + button { |
| | | margin-left: 8px; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .btn-grp .ant-btn { |
| | | min-width: 6em; |
| | | min-width: 6.4em; |
| | | } |
| | | /deep/.locked > td { |
| | | background: #fec54b; |
| | | } |
| | | /deep/.locked.locked.locked.ant-table-row-hover > td, |
| | | /deep/.locked.locked.locked:hover > td { |
| | | background: #fcd583; |
| | | } |
| | | /deep/.unable > td { |
| | | background: #f0637b; |
| | | } |
| | | /deep/.unable.unable.unable.ant-table-row-hover > td, |
| | | /deep/.unable.unable.unable:hover > td { |
| | | background: #ff869a; |
| | | } |
| | | </style> |
| | | |
| | | <style lang="less"> |
| | | .full-modal { |
| | | height: 100%; |
| | | .ant-modal { |
| | | max-width: 100%; |
| | | height: 100%; |
| | | top: 0; |
| | | padding-bottom: 0; |
| | | margin: 0; |
| | | } |
| | | .ant-modal-content { |
| | | display: flex; |
| | | flex-direction: column; |
| | | height: 100%; |
| | | overflow: hidden; |
| | | // height: calc(100vh); |
| | | } |
| | | .ant-modal-body { |
| | | flex: 1; |
| | | } |
| | | } |
| | | </style> |