WXL
2024-07-16 cc73ea5320fed8a39e00bfc0fa02810199559122
src/views/knowledge/questionnaire/compilequer/index.vue
@@ -316,25 +316,28 @@
        <div class="presentation">
          <div class="presentation-left">
            <el-card class="box-card" style="min-height: 688px">
              <el-table v-loading="loading" :data="ruleForm.svyLibScripts">
              <el-table
                v-loading="loading"
                :data="ruleForm.svyTemplateLibScripts"
              >
                <el-table-column
                  label="序号"
                  align="center"
                  key="guid"
                  prop="guid"
                  key="sort"
                  prop="sort"
                />
                <el-table-column
                  label="题目标题"
                  align="center"
                  key="topic"
                  prop="topic"
                  key="scriptTopic"
                  prop="scriptTopic"
                  :show-overflow-tooltip="true"
                />
                <el-table-column
                  label="题目内容"
                  align="center"
                  key="script"
                  prop="script"
                  key="scriptContent"
                  prop="scriptContent"
                  :show-overflow-tooltip="true"
                />
@@ -391,7 +394,7 @@
                </div>
                <el-form-item label="题目标题">
                  <el-input
                    v-model="topicobj.topic"
                    v-model="topicobj.scriptTopic"
                    placeholder="请输入标题"
                  ></el-input>
                </el-form-item>
@@ -427,75 +430,108 @@
                      </el-select> </el-form-item
                  ></el-col>
                </el-row>
                <div class="headline">选项设置</div>
                <div
                  class="topicxq"
                  v-for="item in topicobj.svyLibTemplateTargetoptions"
                >
                  <el-row :gutter="10">
                    <el-col :span="11"
                      ><el-form-item label="题号">
                        <el-input
                          type="text"
                          placeholder="请输入"
                          v-model="item.id"
                          show-word-limit
                <div v-if="topicobj.scriptType != 3">
                  <div class="headline">选项设置</div>
                  <div
                    class="topicxq"
                    v-for="item in topicobj.svyLibTemplateTargetoptions"
                  >
                    <el-row :gutter="10">
                      <el-col :span="11">
                        <el-form-item
                          v-if="topicobj.scoretype == 1"
                          label="分值"
                        >
                        </el-input> </el-form-item
                    ></el-col>
                    <el-col :span="11"
                      ><el-form-item label="分值">
                        <el-input
                          type="text"
                          placeholder="请输入"
                          v-model="item.score"
                          show-word-limit
                          <el-input
                            type="text"
                            placeholder="请输入选项分值"
                            v-model="item.score"
                            show-word-limit
                          >
                          </el-input>
                        </el-form-item>
                        <el-form-item
                          v-else-if="topicobj.scoretype == 2"
                          label="ABC等级"
                        >
                        </el-input> </el-form-item
                    ></el-col>
                  </el-row>
                  <el-row :gutter="10">
                    <el-col :span="11"
                      ><el-form-item label="选项">
                        <el-input
                          type="text"
                          placeholder="请输入选项"
                          v-model="item.optioncontent"
                          show-word-limit
                          <el-radio-group v-model="item.score">
                            <el-radio label="A">A</el-radio>
                            <el-radio label="B">B</el-radio>
                            <el-radio label="C">C</el-radio>
                          </el-radio-group>
                        </el-form-item>
                        <el-form-item
                          v-else-if="topicobj.scoretype == 3"
                          label="优良等级"
                        >
                        </el-input> </el-form-item
                    ></el-col>
                    <el-col :span="11"
                      ><el-form-item label="下题跳转">
                          <el-radio-group v-model="item.score">
                            <el-radio label="优">优</el-radio>
                            <el-radio label="良">良</el-radio>
                            <el-radio label="差">差</el-radio>
                          </el-radio-group>
                        </el-form-item>
                      </el-col>
                    </el-row>
                    <el-row :gutter="10">
                      <el-col :span="11"
                        ><el-form-item label="选项">
                          <el-input
                            type="text"
                            placeholder="请输入选项"
                            v-model="item.optioncontent"
                            show-word-limit
                          >
                          </el-input> </el-form-item
                      ></el-col>
                      <el-col :span="11"
                        ><el-form-item label="下题跳转">
                          <el-input
                            type="text"
                            placeholder="请输入题号"
                            v-model="item.nextQuestion"
                            show-word-limit
                          >
                          </el-input> </el-form-item
                      ></el-col>
                      <!-- <el-col :span="2">
                        <el-button
                          type="danger"
                          icon="el-icon-delete"
                          circle
                          @click="deletexuanx(item)"
                        ></el-button>
                      </el-col> -->
                    </el-row>
                    <el-row :gutter="10">
                      <el-form-item label="选中提示">
                        <el-input
                          type="text"
                          placeholder="请输入题号"
                          v-model="item.jump"
                          show-word-limit
                          style="width: 20vw"
                          type="textarea"
                          autosize
                          placeholder="请输入内容"
                          v-model="item.prompt"
                        >
                        </el-input> </el-form-item
                    ></el-col>
                    <el-col :span="2">
                      <el-button
                        type="danger"
                        icon="el-icon-delete"
                        circle
                        @click="deletexuanx(item)"
                      ></el-button>
                    </el-col>
                  </el-row>
                  <el-row :gutter="10">
                    <el-form-item label="选中提示">
                      <el-input
                        style="width: 20vw"
                        type="textarea"
                        autosize
                        placeholder="请输入内容"
                        v-model="item.prompt"
                      >
                      </el-input
                    ></el-form-item>
                  </el-row>
                        </el-input
                      ></el-form-item>
                    </el-row>
                  </div>
                </div>
                <div v-else>
                  <div class="topicxq">
                    <el-row :gutter="10">
                      <el-form-item label="答案">
                        <el-input
                          style="width: 20vw"
                          type="textarea"
                          autosize
                          placeholder="此处放置患者回答"
                          v-model="radioas"
                        >
                        </el-input
                      ></el-form-item>
                    </el-row>
                  </div>
                </div>
              </el-form>
            </el-card>
@@ -517,42 +553,57 @@
        <el-divider></el-divider>
        <div class="preview-left">
          <!-- 单选 -->
          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
          <div
            class="scriptTopic-dev"
            v-for="item in ruleForm.svyTemplateLibScripts"
            :key="item.sort"
            v-if="item.scriptType == 1"
          >
            <div class="dev-text">
              {{ item.idd }}、[单选]<span>{{ item.wssd }}</span>
              {{ item.sort }}、[单选]<span>{{ item.scriptContent }}</span>
            </div>
            <div class="dev-xx">
              <el-radio-group v-model="radio">
              <el-radio-group v-model="item.remark">
                <el-radio
                  v-for="(items, index) in item.sdadd"
                  v-for="(items, index) in item.svyLibTemplateTargetoptions"
                  :key="index"
                  :label="index"
                  >{{ items }}</el-radio
                  >{{ items.optioncontent }}</el-radio
                >
              </el-radio-group>
            </div>
          </div>
          <!-- 多选 -->
          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
          <div
            class="scriptTopic-dev"
            v-for="item in ruleForm.svyTemplateLibScripts"
            :key="item.sort"
            v-if="item.scriptType == 2"
          >
            <div class="dev-text">
              {{ item.idd }}、[多选]<span>{{ item.wssd }}</span>
              {{ item.sort }}、[多选]<span>{{ item.wssd }}</span>
            </div>
            <div class="dev-xx">
              <el-checkbox-group v-model="radios">
              <el-checkbox-group v-model="item.remark">
                <el-checkbox
                  v-for="(items, index) in item.sdadd"
                  v-for="(items, index) in item.svyLibTemplateTargetoptions"
                  :key="index"
                  :label="index"
                >
                  {{ items }}
                  {{ items.optioncontent }}
                </el-checkbox>
              </el-checkbox-group>
            </div>
          </div>
          <!-- 填空 -->
          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
          <div
            class="scriptTopic-dev"
            v-for="item in ruleForm.svyTemplateLibScripts"
            :key="item.sort"
            v-if="item.scriptType == 3"
          >
            <div class="dev-text">
              {{ item.idd }}、[填空]<span>{{ item.wssd }}</span>
              {{ item.sort }}、[填空]<span>{{ item.optioncontent }}</span>
            </div>
            <div class="dev-xx">
              <el-input placeholder="请输入答案" v-model="radioas" clearable>
@@ -580,9 +631,9 @@
          :inline="true"
          label-width="98px"
        >
          <el-form-item label="问题标题" prop="topic">
          <el-form-item label="问题标题" prop="scriptTopic">
            <el-input
              v-model="queryParams.topic"
              v-model="queryParams.scriptTopic"
              placeholder="请输入"
              clearable
              style="width: 200px"
@@ -607,15 +658,15 @@
          <el-table-column
            label="标题"
            align="center"
            key="topic"
            prop="topic"
            key="scriptTopic"
            prop="scriptTopic"
            width="100"
          />
          <el-table-column
            label="问题内容"
            align="center"
            key="script"
            prop="script"
            key="scriptContent"
            prop="scriptContent"
            width="200"
            :show-overflow-tooltip="true"
          />
@@ -686,14 +737,15 @@
      topicobj: {},
      // 总条数
      total: 1,
      ruleForm: {},
      ruleForm: { svyTemplateLibScripts: [], tempDetpRelevances: [] },
      rules: {},
      rulesa: {},
      optionsclass: [], //分类列表
      optionlist: [
        { value: "topic", table: "topic" },
        { value: "topic", table: "topic" },
        { value: "scriptTopic", table: "scriptTopic" },
        { value: "scriptTopic", table: "scriptTopic" },
      ],
      appraiselist: [
        { label: "分数", value: "1" },
        { label: "ABC等级", value: "2" },
@@ -746,14 +798,38 @@
      tempDetpRelevanceslist: [],
      optionstag: [],
      valuetype: [],
      usable: [],
      required: [],
      usable: [
        { value: "0", label: "可用" },
        { value: "1", label: "停用" },
      ],
      required: [
        { value: "1", label: "必填" },
        { value: "2", label: "不必填" },
      ],
      mode: [], //方式
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
      },
      arr: [
        [
          { id: 1, grade: "5" },
          { id: 2, grade: "5" },
          { id: 3, grade: "5" },
          { id: 4, grade: "5" },
        ],
        [
          { id: 1, grade: "5" },
          { id: 3, grade: "5" },
          { id: 4, grade: "5" },
        ],
        [
          { id: 1, grade: "5" },
          { id: 2, grade: "5" },
          { id: 4, grade: "5" },
        ],
      ],
    };
  },
@@ -766,6 +842,7 @@
    this.required = store.getters.required;
    this.valuetype = store.getters.valuetype;
    this.courtyardlist = store.getters.courtyardlist;
    // this.test();
  },
  methods: {
@@ -791,21 +868,23 @@
    // 获取数据
    getissueinfo() {
      this.id = this.$route.query.id;
      getQtemplatelist({ svyid: this.id }).then((res) => {
        this.ruleForm = res.rows[0];
        this.dynamicTags = this.ruleForm.labelInfo.split(",");
        this.tempDetpRelevanceslist = JSON.parse(this.ruleForm.deptNames);
        this.ruleForm.suitway = this.ruleForm.suitway.split(",");
        console.log(this.tempDetpRelevanceslist);
      });
      if (this.id) {
        getQtemplatelist({ svyid: this.id }).then((res) => {
          this.ruleForm = res.rows[0];
          this.dynamicTags = this.ruleForm.labelInfo.split(",");
          this.tempDetpRelevanceslist = JSON.parse(this.ruleForm.deptNames);
          this.ruleForm.suitway = this.ruleForm.suitway.split(",");
          console.log(this.tempDetpRelevanceslist);
        });
        getillness({ outid: this.id, type: 5 }).then((res) => {
          this.illnesslist = res.rows;
        });
      }
      getillnesslist({
        pageNum: 1,
        pageSize: 100,
      }).then((response) => {
        this.optionsillness = response.rows;
      });
      getillness({ outid: this.id, type: 5 }).then((res) => {
        this.illnesslist = res.rows;
      });
      listDept(this.queryParams).then((response) => {
        this.deptList = this.handleTree(response.data, "deptId");
@@ -824,16 +903,19 @@
      if (this.id) {
        this.ruleForm.isoperation = 2;
        compileQtemplate(this.ruleForm).then((response) => {
        compileQtemplate(this.ruleForm).then((res) => {
          this.$modal.msgSuccess("修改成功");
          this.confirmillness();
          this.$modal.closeLoading();
          this.$router.go(-1);
        });
      } else {
        this.ruleForm.isoperation = 1;
        compileQtemplate(this.ruleForm).then((response) => {
        compileQtemplate(this.ruleForm).then((res) => {
          this.$modal.msgSuccess("新增成功");
          this.confirmillness(res.data);
          this.$modal.closeLoading();
          this.$router.go(-1);
@@ -844,9 +926,9 @@
    Departmenttreatment() {
      this.ruleForm.deptNames = JSON.stringify(this.tempDetpRelevanceslist);
      console.log(this.tempDetpRelevanceslist);
      this.ruleForm.svyLibScripts = this.ruleForm.svyLibScripts.concat(
        this.delScriptVOList
      );
      this.ruleForm.svyTemplateLibScripts =
        this.ruleForm.svyTemplateLibScripts.concat(this.delScriptVOList);
      console.log(this.tempDetpRelevanceslist, "this.tempDetpRelevanceslist");
      const result = this.tempDetpRelevanceslist.map(
        (subArr) => subArr[subArr.length - 1]
      );
@@ -906,6 +988,7 @@
    // 获取题目列表
    getaddtopiclist() {
      this.drawer = true;
      this.queryParams.scoretype = this.ruleForm.scoreType;
      getissuelist(this.queryParams).then((res) => {
        this.loading = false;
        this.userList = res.rows;
@@ -919,46 +1002,51 @@
      row.svyLibScriptOptions.forEach((item) => {
        item.isoperation = 1;
      });
      this.ruleForm.svyLibScripts.push(row);
      row.svyLibTemplateTargetoptions = row.svyLibScriptOptions;
      this.ruleForm.svyTemplateLibScripts.push(row);
      this.sortFn();
      this.$modal.msgSuccess("新增成功");
    },
    handleDelete(row) {
      let index = this.ruleForm.svyLibScripts.indexOf(row);
      this.ruleForm.svyLibScripts.splice(index, 1);
      let index = this.ruleForm.svyTemplateLibScripts.indexOf(row);
      this.ruleForm.svyTemplateLibScripts.splice(index, 1);
      row.isoperation = 3;
      this.delScriptVOList.push(row);
      this.sortFn();
    },
    handleUpdate(row) {
      console.log(row);
      this.topicobj = row;
      this.radioas = "";
      console.log(this.topicobj, "看数据");
      // getissuelist({ svyid: row.svyid }).then((res) => {
      // });
    },
    syioption(row) {
      const index = this.getIndexInArray(this.ruleForm.svyLibScripts, row);
      const item = this.ruleForm.svyLibScripts.splice(index, 1)[0]; // 移除指定索引处的元素,并保存到item变量中
      this.ruleForm.svyLibScripts.splice(index - 1, 0, item); // 将item插入到索引位置的前一位
      const index = this.getIndexInArray(
        this.ruleForm.svyTemplateLibScripts,
        row
      );
      const item = this.ruleForm.svyTemplateLibScripts.splice(index, 1)[0]; // 移除指定索引处的元素,并保存到item变量中
      this.ruleForm.svyTemplateLibScripts.splice(index - 1, 0, item); // 将item插入到索引位置的前一位
      this.sortFn();
    },
    xiayioption(row) {
      const index = this.getIndexInArray(this.ruleForm.svyLibScripts, row);
      const item = this.ruleForm.svyLibScripts.splice(index, 1)[0]; // 移除指定索引处的元素,并保存到item变量中
      this.ruleForm.svyLibScripts.splice(index + 1, 0, item); // 将item插入到索引位置的前一位
      const index = this.getIndexInArray(
        this.ruleForm.svyTemplateLibScripts,
        row
      );
      const item = this.ruleForm.svyTemplateLibScripts.splice(index, 1)[0]; // 移除指定索引处的元素,并保存到item变量中
      this.ruleForm.svyTemplateLibScripts.splice(index + 1, 0, item); // 将item插入到索引位置的前一位
      this.sortFn();
    },
    sortFn() {
      this.ruleForm.svyLibScripts = this.ruleForm.svyLibScripts.map(
        (item, index) => {
          return {
            guid: index + 1,
            svyid: item.svyid,
            script: item.script,
            script: item.script,
          };
        }
      );
      console.log(this.ruleForm.svyLibScripts);
      this.ruleForm.svyTemplateLibScripts.forEach((item, index) => {
        item.sort = index + 1;
        item.svyLibTemplateTargetoptions.forEach((items) => {
          items.nextQuestion = Number(item.sort) + 1;
        });
      });
      console.log(this.ruleForm.svyTemplateLibScripts);
    },
    // 修改题目信息
@@ -1086,8 +1174,11 @@
      this.inputValueillness = "";
    },
    // 保存
    confirmillness() {
    confirmillness(guid) {
      this.illnesslist.forEach((item, index) => {
        if (guid) {
          item.outid = guid;
        }
        if (!item.id) {
          addtargetillness(item).then((res) => {});
        }
@@ -1105,6 +1196,129 @@
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    // 问卷分数限制算法
    // 混合路线
    generateCombinations(arrays, currentIndex = 0, currentCombination = []) {
      if (currentIndex === arrays.length) {
        return [currentCombination];
      }
      const currentArray = arrays[currentIndex];
      const newCombinations = [];
      for (const item of currentArray) {
        const newCombination = [...currentCombination, item];
        const combinations = this.generateCombinations(
          arrays,
          currentIndex + 1,
          newCombination
        );
        newCombinations.push(...combinations);
      }
      return newCombinations;
    },
    // 执行
    test() {
      const arrays = [
        ["2", "3", "4", "5"],
        ["1", "2", "5", "6"],
        ["3", "4", "5", "3"],
        ["3", "2", "5", "7"],
      ];
      const arraysa = [
        {
          id: 1,
          grade: "5",
          arr: [
            { name: "不错", skip: 2 },
            { name: "一般", skip: 2 },
            { name: "还不错", skip: 2 },
            { name: "很棒", skip: 3 },
          ],
        },
        {
          id: 2,
          grade: "5",
          arr: [
            { name: "优秀", skip: 3 },
            { name: "良好", skip: 3 },
            { name: "一般", skip: 3 },
            { name: "较差", skip: 4 },
          ],
        },
        {
          id: 3,
          grade: "5",
          arr: [
            { name: "是的", skip: 4 },
            { name: "不清楚", skip: 4 },
            { name: "还可", skip: 4 },
            { name: "一般", skip: 4 },
          ],
        },
        {
          id: 4,
          grade: "5",
          arr: [
            { name: "真不错", skip: null },
            { name: "还可以", skip: null },
            { name: "一般般", skip: null },
            { name: "不清楚", skip: null },
          ],
        },
      ];
      // const newMixArray = this.generateCombinations(arrays);
      const newMixArray = this.getExecutionOrders(arraysa);
      console.log(newMixArray, "全部路线");
      this.screen(newMixArray);
    },
    getExecutionOrders(data) {
      let orders = [];
      const explore = (currentOrder, id) => {
        console.log(currentOrder, "currentOrder", id);
        const currentQuestion = data[currentOrder[currentOrder.length - 1]];
        if (
          currentQuestion.arr.some(
            (option) =>
              option.skip !== null && !currentOrder.includes(option.skip)
          )
        ) {
          currentQuestion.arr.forEach((option) => {
            if (option.skip !== null && !currentOrder.includes(option.skip)) {
              explore([...currentOrder, option.skip]);
            }
          });
        } else {
          orders.push(
            currentOrder.map((id) => ({
              id: data[id].id,
              grade: data[id].grade,
            }))
          );
        }
      };
      console.log(data, "data");
      data.forEach((entry) => {
        explore([entry.id], entry.id);
      });
      return orders;
    },
    // 数组求和
    sumArray(arr) {
      return arr.reduce((acc, curr) => acc + parseInt(curr), 0);
    },
    // 筛选错误路线
    screen(data) {
      const arraysGreaterThan10 = data.filter((arr) => this.sumArray(arr) > 21);
      console.log(arraysGreaterThan10, "筛选错误路线大于13分");
    },
  },
};
@@ -1161,7 +1375,7 @@
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .topic-dev {
  .scriptTopic-dev {
    margin-bottom: 25px;
    font-size: 20px !important;
    .dev-text {
@@ -1256,7 +1470,7 @@
  width: 22px;
  height: 22px;
}
// ::v-deep.topic-dev.el-radio__label {
// ::v-deep.scriptTopic-dev.el-radio__label {
//   font-size: 24px;
// }
::v-deep.el-radio-group {