研发图纸文件管理系统-前端项目
he wei
2024-01-17 752d135e7d0d229002aed8f558a244ff58e949ca
src/pages/resourceManage/software/list.vue
@@ -28,7 +28,11 @@
              onChange: onPageChange,
              onShowSizeChange: onSizeChange,
            }"
            :rowClassName="rowClassFn"
          >
            <template slot="dataIndex" slot-scope="{ index }">
              {{ index + 1 }}
            </template>
            <template slot="title">
              <a-space>
                <span class="title">软件中心</span>
@@ -59,7 +63,9 @@
              </a-popover>
              <template v-if="canDownloadSoftware">
                <a-divider type="vertical"></a-divider>
                <a :disabled="!!record.soft.lockFlag" @click="download(record)"
                <a
                  :disabled="!!record.soft.lockFlag && !isTester"
                  @click="download(record)"
                  >下载</a
                >
                <a-divider type="vertical"></a-divider>
@@ -74,10 +80,22 @@
                    >更新说明</a-button
                  >
                  <a-button
                    v-if="canLock"
                    v-if="record.soft.lockFlag !== -1 ? canLock : isTester"
                    type="primary"
                    @click="lock(record)"
                    >{{ record.soft.lockFlag ? "解锁" : "锁定" }}</a-button
                  >
                  <a-button
                    v-if="canUploadSoftware"
                    type="primary"
                    @click="handleEmailShow(record)"
                    >邮件通知</a-button
                  >
                  <a-button
                    type="primary"
                    :disabled="!isTester"
                    @click="handleConfirmDelete(record)"
                    >删除</a-button
                  >
                </a-space>
                <a>更多</a>
@@ -92,7 +110,7 @@
      :visible="uploadShow"
      :footer="null"
      :width="760"
      title="上传软件"
      :title="onlyXls ? '更新发布说明' : '上传软件'"
      :destroyOnClose="true"
      :maskClosable="false"
      @cancel="uploadCancel"
@@ -177,6 +195,25 @@
        />
      </a-form-model-item>
    </a-modal>
    <!-- 上传软件 -->
    <a-modal
      :visible="emailShow"
      :footer="null"
      :width="760"
      title="邮件发送"
      :destroyOnClose="true"
      :maskClosable="false"
      @cancel="emailCancel"
    >
      <email-card
        :visible.sync="emailShow"
        :users="userList"
        :title="emailInfo.title"
        :content="emailInfo.content"
        v-if="emailShow"
      ></email-card>
    </a-modal>
  </div>
</template>
@@ -188,6 +225,9 @@
import Pop from "./pop";
import offset from "@/assets/js/tools/offset";
import moment from "moment";
import { getUserList } from "../../permission/apis";
import { message, Modal } from "ant-design-vue";
import {
  getList,
@@ -196,13 +236,25 @@
  productSoftwareSubmit,
  applyModel,
  updateSoftwareLock,
  deleteSoftwareApi,
} from "./apis";
import { mapGetters } from "vuex";
import EmailCard from "../../components/emailCard";
import {
  searchDefaultMailUser,
  sendMail,
} from "../../components/emailCard/apis";
import { getRoleUser } from "@/pages/user/apis";
// TODO
// const tester = ["李桂华"];
export default {
  name: "",
  data() {
    return {
      mailList: [],
      tester: [],
      versionTime: moment().format("YYYY-MM-DD HH:mm:ss"),
      reasonVisible: false,
      reason: "",
@@ -228,6 +280,48 @@
      update: -1,
      conditions: {},
      columns: [
        {
          fixed: "left",
          title: "序号",
          dataIndex: "dataIndex",
          key: "dataIndex",
          align: "center",
          width: 60,
          noSearch: true,
          scopedSlots: { customRender: "dataIndex" },
        },
        {
          title: "状态",
          dataIndex: "soft.lockFlag",
          dataType: "select",
          align: "center",
          width: 140,
          visible: false,
          searchAble: true,
          noSearch: true,
          search: {
            default: 0,
            selectOptions: [
              {
                title: "全部",
                value: 11,
              },
              {
                title: "可用",
                value: 0,
              },
              {
                title: "不可用",
                value: 12,
              },
              {
                title: "待测试",
                value: -1,
              },
            ],
          },
          // customCell: this.customCell,
        },
        {
          title: "名称",
          dataIndex: "soft.fileName",
@@ -319,22 +413,36 @@
          noSearch: true,
        },
      ],
      emailShow: false,
      emailInfo: {
        title: "",
        content: "",
      },
      userList: [],
    };
  },
  components: {
    EmailCard,
    AdvanceTable,
    DescRes,
    Pop,
  },
  methods: {
    moment,
    rowClassFn(record) {
      let classList = [];
      if (record.soft.lockFlag == -1) {
        classList.push("locked");
      }
      return classList;
    },
    disabledDate(current) {
      // Can not select days before today and today
      return current > moment().endOf("day");
    },
    onSearch(conditions, searchOptions) {
      // console.log(conditions);
      // console.log(searchOptions);
      // console.log(searchOptions, "options");
      this.pageCurr = 1;
      this.conditions = conditions;
      this.searchData();
@@ -354,14 +462,21 @@
      this.searchData();
    },
    onReset(conditions) {
      // console.log(conditions, "reset");
      this.conditions = conditions;
      this.searchData();
    },
    searchData() {
      const { pageCurr, pageSize, conditions } = this;
      let params = {};
      if (undefined == conditions["soft.lockFlag"]) {
        conditions["soft.lockFlag"] = 11;
      }
      Object.keys(conditions).forEach((v) => {
        switch (v) {
          case "soft.lockFlag":
            params["lockFlag"] = conditions[v];
            break;
          case "soft.fileName":
            params["fileName"] = conditions[v];
            break;
@@ -401,6 +516,7 @@
    },
    download(obj) {
      const { id } = obj;
      let loading = this.$layer.loading();
      downLoadSoftware(id).then((res) => {
        // console.log(res, "===========");
        let { headers, data, status } = res;
@@ -416,9 +532,11 @@
          link.download = fileName;
          document.body.appendChild(link);
          link.click();
          this.$layer.close(loading);
          document.body.removeChild(link);
          window.URL.revokeObjectURL(url);
        } else {
          this.$layer.close(loading);
          this.$message.error("操作失败");
        }
      });
@@ -500,6 +618,14 @@
      }
      if (!this.resData.length) {
        this.$message.error("软件说明文件解析异常");
        return false;
      }
      let info = this.resData[0];
      if (!info.boardNumber || !info.type) {
        this.$error({
          title: "系统提示",
          content: "缺少板号或软件类型,请输入板号和软件类型",
        });
        return false;
      }
      let loading = this.$layer.loading();
@@ -617,27 +743,144 @@
      let {
        soft: { fileUrl, lockFlag },
      } = this.currentObj;
      // 多传一个当前状态
      let lockFlagNow = lockFlag;
      lockFlag = !lockFlag * 1;
      let params = {
        fileUrl,
        localReason: this.reason,
        lockFlag,
        lockFlagNow,
      };
      updateSoftwareLock(params).then((res) => {
        const { code, data } = res.data;
        if (code && data) {
          this.$message.success("操作成功");
          this.reasonVisible = false;
          // 如果是测试人员解锁确认 则自动发送邮件
          if (lockFlagNow == -1 && this.isTester) {
            this.sendEmail();
          }
          this.searchData();
        } else {
          this.$message.error("操作失败");
        }
      });
    },
    sendEmail() {
      let { title, content } = this.handleEmailShow(this.currentObj, true);
      let params = { mailList: this.mailList, title, content };
      sendMail(params);
    },
    lock(record) {
      this.reason = "";
      this.currentObj = record;
      this.reasonVisible = true;
    },
    handleEmailShow(record, get) {
      this.emailInfo.title =
        "[软件发布记录]" +
        record.soft.fileName +
        " 版本号:" +
        record.soft.version;
      let { soft, links } = record;
      let content = [];
      content.push("软件基本信息");
      content.push("文件名称: " + soft.fileName);
      content.push("板号: " + soft.boardNumber);
      content.push("软件类型: " + soft.type);
      content.push("软件版本: " + soft.version);
      content.push("软件基于版本: " + soft.basedVersion);
      content.push("软件负责人: " + soft.owner);
      content.push("归档日期: " + soft.filingDate);
      content.push("软件类型: " + soft.type);
      content.push("软件适用机型");
      links.forEach((v) => {
        content.push(
          "物料编码: " + v.applyMaterialCode + " 规格型号: " + v.applyModel
        );
      });
      content.push("发布说明: " + soft.releaseNotes);
      this.emailInfo.content = content.join("\n");
      if (get) {
        return {
          title: this.emailInfo.title,
          content: content.join("\n"),
        };
      }
      this.emailShow = true;
    },
    emailCancel() {
      this.emailShow = false;
    },
    searchAllUserList() {
      getUserList()
        .then((res) => {
          let rs = res.data;
          if (rs.code && rs.data) {
            this.userList = rs.data2;
            this.searchDefaultMailUser();
          }
        })
        .catch((error) => {
          console.log(error);
        });
    },
    searchDefaultMailUser() {
      // 软件 type为1
      let type = 1;
      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.userList
          .filter((o) => data.includes(o.name) && o.mail)
          .map((item) => {
            return item.mail;
          });
      });
    },
    getRoleUser() {
      getRoleUser(0)
        .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);
        });
    },
    handleConfirmDelete(obj) {
      Modal.confirm({
        content: () => "删除当前软件,删除后无法恢复,请注意!!!",
        onOk: async () => {
          try {
            const res = await deleteSoftwareApi(
              obj.soft.fileName,
              obj.soft.version
            );
            const rs = res.data;
            if (rs.code === 1 && rs.data) {
              this.$message.success("删除成功。");
            } else {
              this.$message.error("删除失败!!!");
            }
            this.searchData();
          } catch (e) {
            this.$message.error("删除失败,请联系开发人员!!!");
            console.log(e);
          }
        },
      });
    },
  },
  watch: {
@@ -675,7 +918,7 @@
    },
  },
  computed: {
    ...mapGetters("account", ["permits"]),
    ...mapGetters("account", ["permits", "user"]),
    ...mapGetters("setting", ["affixed"]),
    canUploadSoftware() {
      return checkPermit(PERMITS.uploadSoftware, this.permits);
@@ -686,9 +929,14 @@
    canLock() {
      return checkPermit(PERMITS.lockOther, this.permits);
    },
    isTester() {
      return this.tester.some((v) => v == this.user.name);
    },
  },
  mounted() {
    this.getRoleUser();
    this.searchData();
    this.searchAllUserList();
    window.addEventListener("resize", this.resize);
  },
  destroyed() {
@@ -756,4 +1004,11 @@
.btn-grp button {
  width: 6.4em;
}
</style>
/deep/.locked > td {
  background: #fec54b;
}
/deep/.locked.locked.locked.ant-table-row-hover > td,
/deep/.locked.locked.locked:hover > td {
  background: #fcd583;
}
</style>