6 changed files with 930 additions and 518 deletions
			
			
		
								
									
										File diff suppressed because it is too large
									
								
							
						
					@ -0,0 +1,151 @@ | 
				
			|||
<template> | 
				
			|||
  <div> | 
				
			|||
    <el-row> | 
				
			|||
      <el-col> | 
				
			|||
        <div class="top-con"> | 
				
			|||
          <div class="top" v-for="item in top" :key="item">{{ item }}</div> | 
				
			|||
        </div> | 
				
			|||
        <!-- 日历号 --> | 
				
			|||
        <div class="date-con"> | 
				
			|||
          <div | 
				
			|||
            class="date" | 
				
			|||
            :class="[item.thisMonth, item.isToday, item.afterToday]" | 
				
			|||
            v-for="(item, index) in visibleCalendar" | 
				
			|||
            :key="index" | 
				
			|||
          > | 
				
			|||
            <div>{{ item.day }}</div> | 
				
			|||
            <div class="morning">张三,李四</div> | 
				
			|||
            <div class="evening">王五,赵六</div> | 
				
			|||
          </div> | 
				
			|||
        </div> | 
				
			|||
      </el-col> | 
				
			|||
    </el-row> | 
				
			|||
  </div> | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
export default { | 
				
			|||
  props: { | 
				
			|||
    time: { | 
				
			|||
      type: Object, | 
				
			|||
      default: () => { | 
				
			|||
        return { | 
				
			|||
          year: new Date().getFullYear(), | 
				
			|||
          month: new Date().getMonth(), | 
				
			|||
        }; | 
				
			|||
      }, | 
				
			|||
    }, | 
				
			|||
  }, | 
				
			|||
  data() { | 
				
			|||
    return { | 
				
			|||
      top: ["一", "二", "三", "四", "五", "六", "日"], | 
				
			|||
    }; | 
				
			|||
  }, | 
				
			|||
  created() { | 
				
			|||
    console.log("123", this.time); | 
				
			|||
  }, | 
				
			|||
  methods: { | 
				
			|||
    // 获取 | 
				
			|||
  }, | 
				
			|||
  computed: { | 
				
			|||
    // 获取当前月份显示日历,共42天 | 
				
			|||
    visibleCalendar() { | 
				
			|||
      // 获取今天的年月日 | 
				
			|||
      const today = new Date(); | 
				
			|||
      today.setHours(0); | 
				
			|||
      today.setMinutes(0); | 
				
			|||
      today.setSeconds(0); | 
				
			|||
      today.setMilliseconds(0); | 
				
			|||
 | 
				
			|||
      const calendarArr = []; | 
				
			|||
      // 获取当前月份第一天 | 
				
			|||
      const currentFirstDay = new Date(this.time.year, this.time.month, 1); | 
				
			|||
      // 获取第一天是周几 | 
				
			|||
      const weekDay = currentFirstDay.getDay(); | 
				
			|||
      // 用当前月份第一天减去周几前面几天,就是看见的日历的第一天 | 
				
			|||
      const startDay = currentFirstDay - (weekDay - 1) * 24 * 3600 * 1000; | 
				
			|||
      // 我们统一用42天来显示当前显示日历 | 
				
			|||
      for (let i = 0; i < 42; i++) { | 
				
			|||
        const date = new Date(startDay + i * 24 * 3600 * 1000); | 
				
			|||
        calendarArr.push({ | 
				
			|||
          date: new Date(startDay + i * 24 * 3600 * 1000), | 
				
			|||
          year: date.getFullYear(), | 
				
			|||
          month: date.getMonth(), | 
				
			|||
          day: date.getDate(), | 
				
			|||
          // 是否在当月 | 
				
			|||
          thisMonth: | 
				
			|||
            date.getFullYear() === today.getFullYear() && | 
				
			|||
            date.getMonth() === today.getMonth() | 
				
			|||
              ? "thisMonth" | 
				
			|||
              : "", | 
				
			|||
          // 是否是今天 | 
				
			|||
          isToday: | 
				
			|||
            date.getFullYear() === today.getFullYear() && | 
				
			|||
            date.getMonth() === today.getMonth() && | 
				
			|||
            date.getDate() === today.getDate() | 
				
			|||
              ? "isToday" | 
				
			|||
              : "", | 
				
			|||
          // 是否在今天之后 | 
				
			|||
          afterToday: date.getTime() >= today.getTime() ? "afterToday" : "", | 
				
			|||
        }); | 
				
			|||
      } | 
				
			|||
      return calendarArr; | 
				
			|||
    }, | 
				
			|||
  }, | 
				
			|||
}; | 
				
			|||
</script> | 
				
			|||
 | 
				
			|||
<style lang="scss" scoped> | 
				
			|||
.top-con { | 
				
			|||
  display: flex; | 
				
			|||
  align-items: center; | 
				
			|||
  .top { | 
				
			|||
    width: 14.285%; | 
				
			|||
    background-color: rgb(242, 242, 242); | 
				
			|||
    padding: 10px 0; | 
				
			|||
    margin: 5px; | 
				
			|||
    text-align: center; | 
				
			|||
  } | 
				
			|||
} | 
				
			|||
.date-con { | 
				
			|||
  display: flex; | 
				
			|||
  flex-wrap: wrap; | 
				
			|||
  .date { | 
				
			|||
    width: 14.285%; | 
				
			|||
    text-align: center; | 
				
			|||
    padding: 5px; | 
				
			|||
    .morning { | 
				
			|||
      padding: 10px 0; | 
				
			|||
      background-color: rgba(220, 245, 253, 0.3); | 
				
			|||
    } | 
				
			|||
    .evening { | 
				
			|||
      padding: 10px 0; | 
				
			|||
      background-color: rgba(220, 244, 209, 0.3); | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
  .thisMonth { | 
				
			|||
    .morning { | 
				
			|||
      background-color: rgb(220, 245, 253); | 
				
			|||
    } | 
				
			|||
    .evening { | 
				
			|||
      background-color: rgb(220, 244, 209); | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
  .isToday { | 
				
			|||
    font-weight: 700; | 
				
			|||
    .morning { | 
				
			|||
      background-color: rgb(169, 225, 243); | 
				
			|||
    } | 
				
			|||
    .evening { | 
				
			|||
      background-color: rgb(193, 233, 175); | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
} | 
				
			|||
.tip-con { | 
				
			|||
  margin-top: 51px; | 
				
			|||
  .tip { | 
				
			|||
    margin-top: 21px; | 
				
			|||
    width: 100%; | 
				
			|||
  } | 
				
			|||
} | 
				
			|||
</style> | 
				
			|||
@ -0,0 +1,187 @@ | 
				
			|||
<template> | 
				
			|||
  <el-dialog | 
				
			|||
    :visible.sync="visible" | 
				
			|||
    :title="'智能填表'" | 
				
			|||
    :close-on-click-modal="true" | 
				
			|||
    :close-on-press-escape="true" | 
				
			|||
    width="850px" | 
				
			|||
    :top="diaTop" | 
				
			|||
  > | 
				
			|||
    <el-table | 
				
			|||
      v-loading="loading" | 
				
			|||
      :data="list" | 
				
			|||
      row-key="id" | 
				
			|||
      border | 
				
			|||
      :height="tableHeight" | 
				
			|||
      style="width: 100%" | 
				
			|||
    > | 
				
			|||
      <el-table-column type="index" label="序号" width="50" /> | 
				
			|||
      <el-table-column | 
				
			|||
        prop="reportName" | 
				
			|||
        label="模板名称" | 
				
			|||
        header-align="center" | 
				
			|||
        min-width="150" | 
				
			|||
      ></el-table-column> | 
				
			|||
      <el-table-column | 
				
			|||
        label="操作" | 
				
			|||
        fixed="right" | 
				
			|||
        header-align="center" | 
				
			|||
        align="center" | 
				
			|||
        width="150" | 
				
			|||
      > | 
				
			|||
        <template slot-scope="scope"> | 
				
			|||
          <el-button type="text" size="small" @click="fillIn(scope.row)" | 
				
			|||
            >填写</el-button | 
				
			|||
          > | 
				
			|||
        </template> | 
				
			|||
      </el-table-column> | 
				
			|||
    </el-table> | 
				
			|||
  </el-dialog> | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
import { Loading } from "element-ui"; // 引入Loading服务 | 
				
			|||
import { requestPost, requestGet } from "@/js/dai/request"; | 
				
			|||
import { mapGetters } from "vuex"; | 
				
			|||
import axios from "axios"; | 
				
			|||
 | 
				
			|||
export default { | 
				
			|||
  data() { | 
				
			|||
    return { | 
				
			|||
      loading: false, | 
				
			|||
 | 
				
			|||
      visible: false, | 
				
			|||
 | 
				
			|||
      list: [], //客户列表 | 
				
			|||
 | 
				
			|||
      elseParams: {}, | 
				
			|||
    }; | 
				
			|||
  }, | 
				
			|||
 | 
				
			|||
  computed: { | 
				
			|||
    tableHeight() { | 
				
			|||
      // return this.resolution === 'small' ? this.clientHeight - 210 : this.clientHeight - 220 | 
				
			|||
      return this.clientHeight - 300; | 
				
			|||
    }, | 
				
			|||
    diaWidth() { | 
				
			|||
      return this.resolution === "small" ? 60 : 50; | 
				
			|||
    }, | 
				
			|||
    diaHeight() { | 
				
			|||
      return this.resolution === "small" ? 350 : 600; | 
				
			|||
    }, | 
				
			|||
    diaTop() { | 
				
			|||
      return this.resolution === "small" ? "30px" : "100px"; | 
				
			|||
    }, | 
				
			|||
    ...mapGetters(["clientHeight", "resolution"]), | 
				
			|||
  }, | 
				
			|||
 | 
				
			|||
  mounted() {}, | 
				
			|||
 | 
				
			|||
  methods: { | 
				
			|||
    async existsTemplate(row) { | 
				
			|||
      console.log("baobiao----------existsTemplate", row); | 
				
			|||
      const { elseParams } = row; | 
				
			|||
      this.list = []; | 
				
			|||
      this.elseParams = { ...elseParams }; | 
				
			|||
      await this.getList(); | 
				
			|||
      return this.list.length > 0; | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    async init(row) { | 
				
			|||
      console.log("baobiao----------init", row); | 
				
			|||
      const { elseParams } = row; | 
				
			|||
      this.visible = true; | 
				
			|||
      this.elseParams = { ...elseParams }; | 
				
			|||
 | 
				
			|||
      this.list = []; | 
				
			|||
 | 
				
			|||
      await this.getList(); | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //获取所有客户列表 | 
				
			|||
    async getList() { | 
				
			|||
      this.loading = true; | 
				
			|||
      const { elseParams } = this; | 
				
			|||
      const { data, code, msg } = await requestPost( | 
				
			|||
        "/oper/customize/icCustomerReport/report-list", | 
				
			|||
        { | 
				
			|||
          ...elseParams, | 
				
			|||
        } | 
				
			|||
      ); | 
				
			|||
      this.loading = false; | 
				
			|||
      if (code === 0) { | 
				
			|||
        this.list = data.map((item) => { | 
				
			|||
          return item; | 
				
			|||
        }); | 
				
			|||
      } else { | 
				
			|||
        this.$message.error(msg); | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    async fillIn(item) { | 
				
			|||
      const { reportId, reportName } = item; | 
				
			|||
      const url = "/oper/customize/icCustomerReport/preview"; | 
				
			|||
      const parmas = { | 
				
			|||
        ...this.elseParams, | 
				
			|||
        reportId, | 
				
			|||
      }; | 
				
			|||
 | 
				
			|||
      const { data, code, msg } = await requestPost(url, parmas); | 
				
			|||
 | 
				
			|||
      if (code === 0) { | 
				
			|||
        let token = localStorage.getItem("token"); | 
				
			|||
        let prefix = window.SITE_CONFIG["apiURL"].slice(0, -4); | 
				
			|||
        if (item.isList) { | 
				
			|||
          this.exportAll(reportId, data.paramKey, reportName); | 
				
			|||
        } else { | 
				
			|||
          window.open( | 
				
			|||
            `${prefix}/jmreport/view/${reportId}?token=${token}¶mKey=${data.paramKey}` | 
				
			|||
          ); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        // this.visible = false; | 
				
			|||
        this.$emit("afterFillIn"); | 
				
			|||
      } else { | 
				
			|||
        this.$message.error(msg); | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    async exportAll(reportId, paramKey, reportName) { | 
				
			|||
      const url = "/oper/customize/icCustomerReport/batch-export"; | 
				
			|||
      axios({ | 
				
			|||
        url: window.SITE_CONFIG["apiURL"] + url, | 
				
			|||
        method: "post", | 
				
			|||
        data: { | 
				
			|||
          reportId, | 
				
			|||
          paramKey, | 
				
			|||
        }, | 
				
			|||
        responseType: "blob", | 
				
			|||
      }) | 
				
			|||
        .then((res) => { | 
				
			|||
          console.log("批量导出接口返回", res); | 
				
			|||
          // let fileName = window.decodeURI( | 
				
			|||
          //   res.headers["content-disposition"].split(";")[1].split("=")[1] | 
				
			|||
          // ); | 
				
			|||
          let fileName = reportName; | 
				
			|||
          console.log("filename", fileName); | 
				
			|||
          let blob = new Blob([res.data], { type: "application/zip" }); | 
				
			|||
          var url = window.URL.createObjectURL(blob); | 
				
			|||
          var aLink = document.createElement("a"); | 
				
			|||
          aLink.style.display = "none"; | 
				
			|||
          aLink.href = url; | 
				
			|||
          aLink.setAttribute("download", fileName); | 
				
			|||
          document.body.appendChild(aLink); | 
				
			|||
          aLink.click(); | 
				
			|||
          document.body.removeChild(aLink); //下载完成移除元素 | 
				
			|||
          window.URL.revokeObjectURL(url); //释放掉blob对象 | 
				
			|||
        }) | 
				
			|||
        .catch((err) => { | 
				
			|||
          console.log("批量导出失败", err); | 
				
			|||
          return this.$message.error("网络错误"); | 
				
			|||
        }); | 
				
			|||
    }, | 
				
			|||
  }, | 
				
			|||
}; | 
				
			|||
</script> | 
				
			|||
 | 
				
			|||
<style lang="scss" scoped></style> | 
				
			|||
					Loading…
					
					
				
		Reference in new issue