小小儁爺
2026-04-17 b2ca05f7007f588f4d2b8eacb6ceb5535d1570aa
1.看板发布2.报工记录功能发布
已添加3个文件
已修改6个文件
2663 ■■■■ 文件已修改
src/api/ReportManager.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/kanbanManager/jghjcj.vue 564 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/kanbanManager/jghjcj2.vue 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/kanbanManager/jghjcj_back.vue 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/kanbanManager/zpcj.vue 559 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/kanbanManager/zpcj_back.vue 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/statistic/reportList.vue 653 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/ReportManager.js
@@ -186,3 +186,21 @@
    params: data
  })
}
// æŠ¥å·¥è®°å½•列表数据查询
export function MesOrderStepReportSearch(data) {
  return request({
    url: 'ReportManager/MesOrderStepReportSearch',
    method: 'get',
    params: data
  })
}
// æŠ¥å·¥è®°å½•列表数据导出
export function MesOrderStepReportExcelSearch(data) {
  return request({
    url: 'ReportManager/MesOrderStepReportExcelSearch',
    method: 'get',
    params: data
  })
}
src/permission.js
@@ -9,7 +9,7 @@
NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/login', '/zhkb', '/zpcj', '/jghjcj', '/ckgl'] // no redirect whitelist
const whiteList = ['/login', '/zhkb', '/zpcj', '/jghjcj', '/jghjcj2', '/ckgl'] // no redirect whitelist
router.beforeEach(async(to, from, next) => {
  // start progress bar
src/router/index.js
@@ -48,6 +48,10 @@
    component: () => import('@/views/kanbanManager/jghjcj'),
    hidden: true
  }, {
    path: '/jghjcj2',
    component: () => import('@/views/kanbanManager/jghjcj2'),
    hidden: true
  }, {
    path: '/ckgl',
    component: () => import('@/views/kanbanManager/ckgl'),
    hidden: true
@@ -523,9 +527,9 @@
      {
        path: 'reportList',
        name: 'ReportList',
        code: '1040',
        code: '0700',
        component: () => import('@/views/statistic/reportList'),
        meta: { code: '1040', title: '报工记录', icon: '', keepAlive: true }
        meta: { code: '0700', title: '报工记录', icon: '', keepAlive: true }
      },
      {
        path: 'monthReport',
src/views/kanbanManager/jghjcj.vue
@@ -9,7 +9,7 @@
          <span>浙江阿鲁克健身器材有限公司</span>
        </div>
        <div class="kb_headTime kb_header_text" style="top: 35px;left:  772px">
        <div class="kb_headTime kb_header_text" style="top: 35px;left:  768px">
          <span>金工焊接车间数字化看板</span>
        </div>
@@ -17,55 +17,134 @@
          <span>{{ headTime }}</span>
        </div>
      </div>
      <div
        style=" padding:5px 20px 20px 20px;z-index:2;height: 940px;flex-direction: column;justify-content: space-between;"
      >
        <!--        ä¸Šè¾¹-->
        <div style="display: flex;justify-content: space-between">
          <div style="width:100%">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§ä¿¡æ¯
            </div>
            <div style="height: 450px">
              <dv-border-box-12>
                <dv-scroll-board
                  ref="scrollBoardTop"
                  :config="configTableTop"
                  style="width: 99%;height: 430px;margin:0 auto;padding-top: 13px;"
                />
              </dv-border-box-12>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 1000px;">
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="blcs" class="svg_class" />
              è´¨é‡ä¸è‰¯(近一周)
              é‡‡è´­è®¢å•(月/å­£)
            </div>
            <div
              class="lineContent horn"
              style="height: 450px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div style="height: 180px;padding: 10px;display: flex;justify-content: space-between">
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl03" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
                <div v-for="i in LeftTopData01" :key="i.Quarter" class="flex_c_s">
                  <div class="all_block03 flex_c_s">
                    <div class="flex_c_c all_block04">{{ i.Quarter }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.quantity }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">入库数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.ouquantity }}</div>
                    </div>
                  </div>
            </div>
          </div>
          <div style="width: 850px;">
              <div style="height: 260px;">
                <div id="all02_1" class="flex_c_c" style="width: 100%;height:100%;" />
              </div>
            </div>
          </div>
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="cggz" class="svg_class" />
              é”€å”®è®¢å•(月/å­£)
            </div>
            <div
              class="lineContent horn"
              style="height: 450px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div style="height: 180px;padding: 10px;display: flex;justify-content: space-between">
                <div v-for="i in RightTopData01" :key="i.Quarter" class="flex_c_s">
                  <div class="all_block03 flex_c_s">
                    <div class="flex_c_c all_block04">{{ i.Quarter }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.quantity }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">出库数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.ouquantity }}</div>
                    </div>
                  </div>
                </div>
              </div>
              <div style="height: 260px;">
                <div id="all02" class="flex_c_c" style="width: 100%;height:100%;" />
              </div>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§å®Œå·¥(当月)
            </div>
            <div
              class="lineContent horn"
              style="height: 380px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div
                style="padding: 10px;
                display: flex;justify-content: flex-start;
                flex-wrap: wrap;"
              >
                <div v-for="i in LeftBottomData01" :key="i.wkshp_code" style="margin:0 18px" class="flex_c_s">
                  <div class="all_block01 flex_c_s">
                    <div class="flex_c_c all_block02" style="">{{ i.wkshp_name }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block02 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block02 flex_c_c" style="width: 49% ">{{ i.plan_qty }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block02 flex_c_c" style="width: 49% ">完工数</div>
                      <div class="all_block02 flex_c_c" style="width: 49% ">{{ i.good_qty }}</div>
                    </div>
                  </div>
                </div>
              </div>
              <!--              <div style="height: 260px;">-->
              <!--                <div id="all01" class="flex_c_c" style="width: 100%;height:100%;" />-->
              <!--              </div>-->
            </div>
          </div>
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="ckkc" class="svg_class" />
              ä¸è‰¯ç»Ÿè®¡(近一月)
              ä»“库库存
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl04" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            <div class="lineContent horn" style="height: 380px;display: flex;justify-content: space-between">
              <div style="display: flex;justify-content: center;position: relative">
                <div class="kb_center_block_children all_block05">
                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.Y) }}</div>
                  <div class="box02" />
                  <div>原材料</div>
                </div>
                <!--                <div class="kb_center_block_children all_block06">-->
                <!--                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.B) }}</div>-->
                <!--                  <div class="box02" />-->
                <!--                  <div>半成品</div>-->
                <!--                </div>-->
                <div class="kb_center_block_children all_block07">
                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.C) }}</div>
                  <div class="box02" />
                  <div>产成品</div>
                </div>
              </div>
            </div>
          </div>
        </div>
@@ -76,11 +155,9 @@
<script>
import './kbCommon.css'
import { loadEcharts, cjzl04, cjzl03_2, cjzl03 } from '@/utils/myEcharts'
import { loadEcharts, all02, all03 } from '@/utils/myEcharts'
import {
  WorkShopProduceBottomLeftData,
  WorkShopProduceBottomRightData,
  WorkShopProduceTopData
  WorkShopCompreLeftBottom, WorkShopCompreLeftTop, WorkShopCompreRightBottom, WorkShopCompreRightTop
} from '@/api/kanbanManager'
export default {
@@ -88,152 +165,164 @@
  data() {
    return {
      headTime: '',
      tableDataRightTop: [],
      cjzl03_xData: [],
      cjzl03_yData: [],
      RightBottom: [],
      LeftTopData01: [],
      LeftTopData02: [],
      configTableTop: {
        headerBGC: 'rgba(38, 68 ,139, 0.2)', // è¡¨å¤´èƒŒæ™¯è‰²
        oddRowBGC: 'transparent', // å¥‡æ•°è¡ŒèƒŒæ™¯è‰²
        evenRowBGC: 'transparent', // å¶æ•°è¡ŒèƒŒæ™¯è‰²
        headerHeight: 45,
        waitTime: 3000,
        rowNum: 8,
      RightTopData01: [],
      RightTopData02: [],
        header: [
          '<span style="color:#09d8f2;">工单号</span>',
          '<span style="color:#09d8f2;">产品编码</span>',
          '<span style="color:#09d8f2;">产品名称</span>',
          '<span style="color:#09d8f2;">产品规格</span>',
          '<span style="color:#09d8f2;">任务数量</span>',
          '<span style="color:#09d8f2;">合格数量</span>',
          '<span style="color:#09d8f2;">不良数量</span>',
      LeftBottomData01: [],
      LeftBottomData02: [],
          '<span style="color:#09d8f2;">工序顺序</span>',
          '<span style="color:#09d8f2;">工序编码</span>',
          '<span style="color:#09d8f2;">工序名称</span>',
          '<span style="color:#09d8f2;">完成进度(%)</span>'
        ],
        // '<span style="color:#09d8f2;">工废数量</span>',
        // '<span style="color:#09d8f2;">料废数量</span>',
        data: [
          // ['<span style="color:#37a2da;">行1列1</span>', '行1列2', '行1列3'],
        ],
        // index: true, , 130, 130
        columnWidth: [200, 140, 350, 350, 130, 130, 130, 130, 130, 130, 130],
        align: ['center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center']
        // carousel: 'page'
      }
      RightBottom: {}
    }
  },
  created() {
    setInterval(this.getNowTime, 1000)
    // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    // // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    setInterval(() => {
      window.location.reload()
    }, 1000 * 60 * 120)
  },
  async mounted() {
    await this.getWorkShopProduceTopData()
    setInterval(() => {
      this.getWorkShopProduceTopData()
    }, 10 * 1000)
    await this.getWorkShopProduceBottomLeftData()
    setInterval(() => {
      this.getWorkShopProduceBottomLeftData()
    }, 20 * 1000)
    await this.getWorkShopProduceBottomRightData()
    setInterval(() => {
      this.getWorkShopProduceBottomRightData()
    }, 30 * 1000)
  mounted() {
    this.getAllApi()
  },
  methods: {
    async getWorkShopProduceTopData() {
      WorkShopProduceTopData({ wkshopcode: '02,03' }).then(res => {
        const flag = this.compareArrays(this.configTableTop.data, res.data)
        if (!flag) {
          this.configTableTop.data = res.data.map(i =>
            [
              i.wo_code,
              i.partcode,
              i.partname,
              i.partspec ? i.partspec : '/',
              i.plan_qty,
              i.good_qty,
              `<span style="color: red;">${i.ng_qty}</span>`,
              i.seq,
              i.step_code,
              i.step_name,
              parseFloat(i.schedule.toFixed(2))
    async getAllApi() {
      // å·¦ä¸Š é‡‡è´­è®¢å•
      const res2 = await WorkShopCompreLeftBottom()
      res2.data.BottomLeftTop.forEach(i => {
        this.LeftTopData01.push({
          Quarter: i.Quarter,
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      res2.data.BottomLeftBottom.forEach(i => {
        this.LeftTopData02.push({
          Month: i.Month + '月',
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      loadEcharts('all02_1', all02(this.LeftTopData02, '每月采购数量/入库数量'))
      setInterval(() => {
        this.LeftTopData01 = []
        this.LeftTopData02 = []
        WorkShopCompreLeftBottom().then(res2 => {
          res2.data.BottomLeftTop.forEach(i => {
            this.LeftTopData01.push({
              Quarter: i.Quarter,
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          res2.data.BottomLeftBottom.forEach(i => {
            this.LeftTopData02.push({
              Month: i.Month + '月',
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          loadEcharts('all02_1', all02(this.LeftTopData02, '每月采购数量/入库数量'))
        })
      }, 1000 * 35)
      // å³ä¸Š é”€å”®è®¢å•
      const res3 = await WorkShopCompreRightTop()
      res3.data.RightTop.forEach(i => {
        this.RightTopData01.push({
          Quarter: i.Quarter,
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      res3.data.RightBottom.forEach(i => {
        this.RightTopData02.push({
          Month: i.Month + '月',
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      loadEcharts('all02', all02(this.RightTopData02, '每月订单数量/出库数量'))
      setInterval(() => {
        WorkShopCompreRightTop().then(res3 => {
          this.RightTopData01 = []
          this.RightTopData02 = []
          res3.data.RightTop.forEach(i => {
            this.RightTopData01.push({
              Quarter: i.Quarter,
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          res3.data.RightBottom.forEach(i => {
            this.RightTopData02.push({
              Month: i.Month + '月',
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          loadEcharts('all02', all02(this.RightTopData02, '每月订单数量/出库数量'))
        })
      }, 1000 * 40)
      const temp2 = [
        { wkshp_code: '02', wkshp_name: '金工车间' },
        { wkshp_code: '03', wkshp_name: '焊接车间' }
            ]
          )
          // `<span style="color: red;">${i.laborbad_qty}</span>`,
          // `<span style="color: red;">${i.materielbad_qty}</span>`,
          this.$refs['scrollBoardTop'].updateRows(this.configTableTop.data)
      // å·¦ä¸‹ ç”Ÿäº§è®¢å•
      const res4 = await WorkShopCompreLeftTop({ wkshopcode: temp2.map(i => i.wkshp_code).join(',') })
      for (const res4Key in res4.data.LeftTop) {
        const data = {
          good_qty: 0,
          plan_qty: 0,
          wkshp_code: '',
          wkshp_name: ''
        }
        data.good_qty = res4.data.LeftTop[res4Key][0].good_qty
        data.plan_qty = res4.data.LeftTop[res4Key][0].plan_qty
        data.wkshp_code = res4.data.LeftTop[res4Key][0].wkshp_code
        data.wkshp_name = temp2.find(i => i.wkshp_code === data.wkshp_code).wkshp_name
        this.LeftBottomData01.push(data)
      }
      setInterval(() => {
        WorkShopCompreLeftTop({ wkshopcode: temp2.map(i => i.wkshp_code).join(',') }).then(res2 => {
          this.LeftBottomData01 = []
          this.LeftBottomData02 = []
          for (const res4Key in res4.data.LeftTop) {
            const data = {
              good_qty: 0,
              plan_qty: 0,
              wkshp_code: '',
              wkshp_name: ''
            }
            data.good_qty = res2.data.LeftTop[res4Key][0].good_qty
            data.plan_qty = res2.data.LeftTop[res4Key][0].plan_qty
            data.wkshp_code = res2.data.LeftTop[res4Key][0].wkshp_code
            data.wkshp_name = temp2.find(i => i.wkshp_code === data.wkshp_code).wkshp_name
            this.LeftBottomData01.push(data)
        }
      })
    },
    async getWorkShopProduceBottomLeftData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
      }, 1000 * 30)
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res4 = await WorkShopProduceBottomLeftData({ wkshopcode: temp.map(i => i.code).join(',') })
      // this.cjzl03_xData = res4.data['101,001'].map(i => i.click_date)
      // this.cjzl03_yData = res4.data['101,001'].map(i => i.count)
      const a = res4.data['004'].map(i => i.click_date) // echarts横坐标
      const b = temp.map(i => i.name)// legendData值
      const c = [
        // res4.data['01'].map(i => i.count),
        // res4.data['02'].map(i => i.count),
        // res4.data['03'].map(i => i.count),
        // res4.data['04'].map(i => i.count),
        // res4.data['05'].map(i => i.count)
        res4.data['004'].map(i => i.count)
      ]// çºµåæ ‡å€¼
      loadEcharts('cjzl03', cjzl03(a, b, c))
    },
    async getWorkShopProduceBottomRightData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res5 = await WorkShopProduceBottomRightData({ wkshopcode: temp.map(i => i.code).join(',') })
      // å³ä¸‹ ä»“库库存
      const res5 = await WorkShopCompreRightBottom()
      this.RightBottom = res5.data
      if (this.RightBottom.length > 0) {
        loadEcharts('cjzl04', cjzl04(this.RightBottom.map(i => i.name), this.RightBottom.map(i => i.cont)))
      }
    },
      setInterval(() => {
        WorkShopCompreRightBottom().then(res5 => {
          this.RightBottom = res5.data
        })
      }, 1000 * 60)
    },
    // èŽ·å–å½“å‰æ—¶é—´
    getNowTime() {
      const dt = new Date()
@@ -250,23 +339,25 @@
      this.headTime = `${y}-${m}-${d}  ${hh}:${mm}:${ss}   ${week}`
    },
    // ä¸¤ä¸ªæ•°ç»„做对比
    compareArrays(arr1, arr2) {
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      if (set1.size !== set2.size) {
        return false
    headerCellStyle() {
      return {
        backgroundColor: 'transparent ',
        padding: '10px 0',
        textAlign: 'center',
        color: '#07acc2',
        border: 'none',
        fontSize: '20px'
      }
      for (const value of set1) {
        if (!set2.has(value)) {
          return false
    },
    cellStyle() {
      return {
        padding: '7px 0',
        textAlign: 'center',
        backgroundColor: 'transparent ',
        color: '#c7e7ff',
        border: 'none',
        fontSize: '20px'
        }
      }
      return true
    }
  }
@@ -275,13 +366,120 @@
</script>
<style lang="scss" scoped>
::v-deep .header-item {
  font-size: 16px !important;
$main_color: #09d8f2;
$color01: #00FFFF;
.tableData {
  background: transparent;
}
::v-deep .row-item {
  font-size: 16px !important;
.el-table::before {
  height: 0;
}
.el-table__empty-text {
  color: $main_color;
}
.tableDataCell {
  ::v-deep .cell {
    padding: 0 2px;
  }
}
::v-deep .el-table__body-wrapper::-webkit-scrollbar {
  /* width: 0;宽度为0暗藏 */
  width: 0;
  background: transparent;
}
::v-deep .el-table th,
::v-deep .el-table tr,
::v-deep .el-table td {
  background-color: transparent;
}
.all_block01 {
  width: 187px;
  height: 180px;
}
.all_block02 {
  width: 100%;
  height: 49px;
  background: rgba(9, 216, 242, 0.1);
}
.all_block03 {
  width: 199px;
  height: 180px;
}
.all_block04 {
  width: 100%;
  height: 49px;
  background: rgba(9, 216, 242, 0.1);
}
.kb_center_block_children {
  height: 180px;
  //border: 1px solid $kbBorderColor;
  width: 240px;
  display: flex;
  z-index: 2;
  justify-content: space-around;
  align-items: center;
  flex-direction: column;
  margin: 10px;
  font-size: 22px;
  .box02 {
    background: url("../../assets/images/box02.png") no-repeat;
    transform: scale(1.5);
    width: 145px;
    height: 84px;
  }
}
.all_block05 {
  position: absolute;
  animation: upDown 3s ease-in-out infinite;
  left: 170px;
}
//.all_block06 {
//  position: absolute;
//  animation: upDown2 3s ease-in-out infinite;
//  left: 320px;
//}
.all_block07 {
  position: absolute;
  animation: upDown2 3s ease-in-out infinite;
  left: 470px;
}
@keyframes upDown {
  0% {
    top: 50px;
  }
  50% {
    top: 100px;
  }
  100% {
    top: 50px;
  }
}
@keyframes upDown2 {
  0% {
    top: 100px;
  }
  50% {
    top: 50px;
  }
  100% {
    top: 100px;
  }
}
</style>
src/views/kanbanManager/jghjcj2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,287 @@
<template>
  <div>
    <div class="kb_dashboard" style="display:flex;flex-direction: column;justify-content: space-between">
      <div class="kb_backgroundCustom" />
      <div class="kb_header">
        <div class="kb_headTime" style="top: 35px;left:  20px">
          <span>浙江阿鲁克健身器材有限公司</span>
        </div>
        <div class="kb_headTime kb_header_text" style="top: 35px;left:  772px">
          <span>金工焊接车间数字化看板</span>
        </div>
        <div class="kb_headTime" style="top: 35px;right:  25px">
          <span>{{ headTime }}</span>
        </div>
      </div>
      <div
        style=" padding:5px 20px 20px 20px;z-index:2;height: 940px;flex-direction: column;justify-content: space-between;"
      >
        <!--        ä¸Šè¾¹-->
        <div style="display: flex;justify-content: space-between">
          <div style="width:100%">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§ä¿¡æ¯
            </div>
            <div style="height: 450px">
              <dv-border-box-12>
                <dv-scroll-board
                  ref="scrollBoardTop"
                  :config="configTableTop"
                  style="width: 99%;height: 430px;margin:0 auto;padding-top: 13px;"
                />
              </dv-border-box-12>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 1000px;">
            <div class="smallTitle">
              <svg-icon icon-class="blcs" class="svg_class" />
              è´¨é‡ä¸è‰¯(近一周)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl03" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
          <div style="width: 850px;">
            <div class="smallTitle">
              <svg-icon icon-class="ckkc" class="svg_class" />
              ä¸è‰¯ç»Ÿè®¡(近一月)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl04" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import './kbCommon.css'
import { loadEcharts, cjzl04, cjzl03_2, cjzl03 } from '@/utils/myEcharts'
import {
  WorkShopProduceBottomLeftData,
  WorkShopProduceBottomRightData,
  WorkShopProduceTopData
} from '@/api/kanbanManager'
export default {
  name: 'Cjsc',
  data() {
    return {
      headTime: '',
      cjzl03_xData: [],
      cjzl03_yData: [],
      RightBottom: [],
      configTableTop: {
        headerBGC: 'rgba(38, 68 ,139, 0.2)', // è¡¨å¤´èƒŒæ™¯è‰²
        oddRowBGC: 'transparent', // å¥‡æ•°è¡ŒèƒŒæ™¯è‰²
        evenRowBGC: 'transparent', // å¶æ•°è¡ŒèƒŒæ™¯è‰²
        headerHeight: 45,
        waitTime: 3000,
        rowNum: 8,
        header: [
          '<span style="color:#09d8f2;">工单号</span>',
          '<span style="color:#09d8f2;">产品编码</span>',
          '<span style="color:#09d8f2;">产品名称</span>',
          '<span style="color:#09d8f2;">产品规格</span>',
          '<span style="color:#09d8f2;">任务数量</span>',
          '<span style="color:#09d8f2;">合格数量</span>',
          '<span style="color:#09d8f2;">不良数量</span>',
          '<span style="color:#09d8f2;">工序顺序</span>',
          '<span style="color:#09d8f2;">工序编码</span>',
          '<span style="color:#09d8f2;">工序名称</span>',
          '<span style="color:#09d8f2;">完成进度(%)</span>'
        ],
        // '<span style="color:#09d8f2;">工废数量</span>',
        // '<span style="color:#09d8f2;">料废数量</span>',
        data: [
          // ['<span style="color:#37a2da;">行1列1</span>', '行1列2', '行1列3'],
        ],
        // index: true, , 130, 130
        columnWidth: [200, 140, 350, 350, 130, 130, 130, 130, 130, 130, 130],
        align: ['center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center']
        // carousel: 'page'
      }
    }
  },
  created() {
    setInterval(this.getNowTime, 1000)
    // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    setInterval(() => {
      window.location.reload()
    }, 1000 * 60 * 120)
  },
  async mounted() {
    await this.getWorkShopProduceTopData()
    setInterval(() => {
      this.getWorkShopProduceTopData()
    }, 10 * 1000)
    await this.getWorkShopProduceBottomLeftData()
    setInterval(() => {
      this.getWorkShopProduceBottomLeftData()
    }, 20 * 1000)
    await this.getWorkShopProduceBottomRightData()
    setInterval(() => {
      this.getWorkShopProduceBottomRightData()
    }, 30 * 1000)
  },
  methods: {
    async getWorkShopProduceTopData() {
      WorkShopProduceTopData({ wkshopcode: '02,03' }).then(res => {
        const flag = this.compareArrays(this.configTableTop.data, res.data)
        if (!flag) {
          this.configTableTop.data = res.data.map(i =>
            [
              i.wo_code,
              i.partcode,
              i.partname,
              i.partspec ? i.partspec : '/',
              i.plan_qty,
              i.good_qty,
              `<span style="color: red;">${i.ng_qty}</span>`,
              i.seq,
              i.step_code,
              i.step_name,
              parseFloat(i.schedule.toFixed(2))
            ]
          )
          // `<span style="color: red;">${i.laborbad_qty}</span>`,
          // `<span style="color: red;">${i.materielbad_qty}</span>`,
          this.$refs['scrollBoardTop'].updateRows(this.configTableTop.data)
        }
      })
    },
    async getWorkShopProduceBottomLeftData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res4 = await WorkShopProduceBottomLeftData({ wkshopcode: temp.map(i => i.code).join(',') })
      // this.cjzl03_xData = res4.data['101,001'].map(i => i.click_date)
      // this.cjzl03_yData = res4.data['101,001'].map(i => i.count)
      const a = res4.data['03'].map(i => i.click_date) // echarts横坐标
      const b = temp.map(i => i.name)// legendData值
      const c = [
        // res4.data['01'].map(i => i.count),
        // res4.data['02'].map(i => i.count),
        // res4.data['03'].map(i => i.count),
        res4.data['02'].map(i => i.count),
        res4.data['03'].map(i => i.count)
        // res4.data['004'].map(i => i.count)
      ]// çºµåæ ‡å€¼
      loadEcharts('cjzl03', cjzl03(a, b, c))
    },
    async getWorkShopProduceBottomRightData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res5 = await WorkShopProduceBottomRightData({ wkshopcode: temp.map(i => i.code).join(',') })
      this.RightBottom = res5.data
      if (this.RightBottom.length > 0) {
        loadEcharts('cjzl04', cjzl04(this.RightBottom.map(i => i.name), this.RightBottom.map(i => i.cont)))
      }
    },
    // èŽ·å–å½“å‰æ—¶é—´
    getNowTime() {
      const dt = new Date()
      const wk = dt.getDay()
      const y = dt.getFullYear()
      const m = (dt.getMonth() + 1 + '').padStart(2, '0')
      const d = (dt.getDate() + '').padStart(2, '0')
      const hh = (dt.getHours() + '').padStart(2, '0')
      const mm = (dt.getMinutes() + '').padStart(2, '0')
      const ss = (dt.getSeconds() + '').padStart(2, '0')
      const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
      const week = weeks[wk]
      this.headTime = `${y}-${m}-${d}  ${hh}:${mm}:${ss}   ${week}`
    },
    // ä¸¤ä¸ªæ•°ç»„做对比
    compareArrays(arr1, arr2) {
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      if (set1.size !== set2.size) {
        return false
      }
      for (const value of set1) {
        if (!set2.has(value)) {
          return false
        }
      }
      return true
    }
  }
}
</script>
<style lang="scss" scoped>
::v-deep .header-item {
  font-size: 16px !important;
}
::v-deep .row-item {
  font-size: 16px !important;
}
</style>
src/views/kanbanManager/jghjcj_back.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,287 @@
<template>
  <div>
    <div class="kb_dashboard" style="display:flex;flex-direction: column;justify-content: space-between">
      <div class="kb_backgroundCustom" />
      <div class="kb_header">
        <div class="kb_headTime" style="top: 35px;left:  20px">
          <span>浙江阿鲁克健身器材有限公司</span>
        </div>
        <div class="kb_headTime kb_header_text" style="top: 35px;left:  772px">
          <span>金工焊接车间数字化看板</span>
        </div>
        <div class="kb_headTime" style="top: 35px;right:  25px">
          <span>{{ headTime }}</span>
        </div>
      </div>
      <div
        style=" padding:5px 20px 20px 20px;z-index:2;height: 940px;flex-direction: column;justify-content: space-between;"
      >
        <!--        ä¸Šè¾¹-->
        <div style="display: flex;justify-content: space-between">
          <div style="width:100%">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§ä¿¡æ¯
            </div>
            <div style="height: 450px">
              <dv-border-box-12>
                <dv-scroll-board
                  ref="scrollBoardTop"
                  :config="configTableTop"
                  style="width: 99%;height: 430px;margin:0 auto;padding-top: 13px;"
                />
              </dv-border-box-12>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 1000px;">
            <div class="smallTitle">
              <svg-icon icon-class="blcs" class="svg_class" />
              è´¨é‡ä¸è‰¯(近一周)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl03" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
          <div style="width: 850px;">
            <div class="smallTitle">
              <svg-icon icon-class="ckkc" class="svg_class" />
              ä¸è‰¯ç»Ÿè®¡(近一月)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl04" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import './kbCommon.css'
import { loadEcharts, cjzl04, cjzl03_2, cjzl03 } from '@/utils/myEcharts'
import {
  WorkShopProduceBottomLeftData,
  WorkShopProduceBottomRightData,
  WorkShopProduceTopData
} from '@/api/kanbanManager'
export default {
  name: 'Cjsc',
  data() {
    return {
      headTime: '',
      cjzl03_xData: [],
      cjzl03_yData: [],
      RightBottom: [],
      configTableTop: {
        headerBGC: 'rgba(38, 68 ,139, 0.2)', // è¡¨å¤´èƒŒæ™¯è‰²
        oddRowBGC: 'transparent', // å¥‡æ•°è¡ŒèƒŒæ™¯è‰²
        evenRowBGC: 'transparent', // å¶æ•°è¡ŒèƒŒæ™¯è‰²
        headerHeight: 45,
        waitTime: 3000,
        rowNum: 8,
        header: [
          '<span style="color:#09d8f2;">工单号</span>',
          '<span style="color:#09d8f2;">产品编码</span>',
          '<span style="color:#09d8f2;">产品名称</span>',
          '<span style="color:#09d8f2;">产品规格</span>',
          '<span style="color:#09d8f2;">任务数量</span>',
          '<span style="color:#09d8f2;">合格数量</span>',
          '<span style="color:#09d8f2;">不良数量</span>',
          '<span style="color:#09d8f2;">工序顺序</span>',
          '<span style="color:#09d8f2;">工序编码</span>',
          '<span style="color:#09d8f2;">工序名称</span>',
          '<span style="color:#09d8f2;">完成进度(%)</span>'
        ],
        // '<span style="color:#09d8f2;">工废数量</span>',
        // '<span style="color:#09d8f2;">料废数量</span>',
        data: [
          // ['<span style="color:#37a2da;">行1列1</span>', '行1列2', '行1列3'],
        ],
        // index: true, , 130, 130
        columnWidth: [200, 140, 350, 350, 130, 130, 130, 130, 130, 130, 130],
        align: ['center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center']
        // carousel: 'page'
      }
    }
  },
  created() {
    setInterval(this.getNowTime, 1000)
    // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    setInterval(() => {
      window.location.reload()
    }, 1000 * 60 * 120)
  },
  async mounted() {
    await this.getWorkShopProduceTopData()
    setInterval(() => {
      this.getWorkShopProduceTopData()
    }, 10 * 1000)
    await this.getWorkShopProduceBottomLeftData()
    setInterval(() => {
      this.getWorkShopProduceBottomLeftData()
    }, 20 * 1000)
    await this.getWorkShopProduceBottomRightData()
    setInterval(() => {
      this.getWorkShopProduceBottomRightData()
    }, 30 * 1000)
  },
  methods: {
    async getWorkShopProduceTopData() {
      WorkShopProduceTopData({ wkshopcode: '02,03' }).then(res => {
        const flag = this.compareArrays(this.configTableTop.data, res.data)
        if (!flag) {
          this.configTableTop.data = res.data.map(i =>
            [
              i.wo_code,
              i.partcode,
              i.partname,
              i.partspec ? i.partspec : '/',
              i.plan_qty,
              i.good_qty,
              `<span style="color: red;">${i.ng_qty}</span>`,
              i.seq,
              i.step_code,
              i.step_name,
              parseFloat(i.schedule.toFixed(2))
            ]
          )
          // `<span style="color: red;">${i.laborbad_qty}</span>`,
          // `<span style="color: red;">${i.materielbad_qty}</span>`,
          this.$refs['scrollBoardTop'].updateRows(this.configTableTop.data)
        }
      })
    },
    async getWorkShopProduceBottomLeftData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res4 = await WorkShopProduceBottomLeftData({ wkshopcode: temp.map(i => i.code).join(',') })
      // this.cjzl03_xData = res4.data['101,001'].map(i => i.click_date)
      // this.cjzl03_yData = res4.data['101,001'].map(i => i.count)
      const a = res4.data['004'].map(i => i.click_date) // echarts横坐标
      const b = temp.map(i => i.name)// legendData值
      const c = [
        // res4.data['01'].map(i => i.count),
        // res4.data['02'].map(i => i.count),
        // res4.data['03'].map(i => i.count),
        // res4.data['04'].map(i => i.count),
        // res4.data['05'].map(i => i.count)
        res4.data['004'].map(i => i.count)
      ]// çºµåæ ‡å€¼
      loadEcharts('cjzl03', cjzl03(a, b, c))
    },
    async getWorkShopProduceBottomRightData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '02', name: '金工车间' },
        { code: '03', name: '焊接车间' }
      ]
      const res5 = await WorkShopProduceBottomRightData({ wkshopcode: temp.map(i => i.code).join(',') })
      this.RightBottom = res5.data
      if (this.RightBottom.length > 0) {
        loadEcharts('cjzl04', cjzl04(this.RightBottom.map(i => i.name), this.RightBottom.map(i => i.cont)))
      }
    },
    // èŽ·å–å½“å‰æ—¶é—´
    getNowTime() {
      const dt = new Date()
      const wk = dt.getDay()
      const y = dt.getFullYear()
      const m = (dt.getMonth() + 1 + '').padStart(2, '0')
      const d = (dt.getDate() + '').padStart(2, '0')
      const hh = (dt.getHours() + '').padStart(2, '0')
      const mm = (dt.getMinutes() + '').padStart(2, '0')
      const ss = (dt.getSeconds() + '').padStart(2, '0')
      const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
      const week = weeks[wk]
      this.headTime = `${y}-${m}-${d}  ${hh}:${mm}:${ss}   ${week}`
    },
    // ä¸¤ä¸ªæ•°ç»„做对比
    compareArrays(arr1, arr2) {
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      if (set1.size !== set2.size) {
        return false
      }
      for (const value of set1) {
        if (!set2.has(value)) {
          return false
        }
      }
      return true
    }
  }
}
</script>
<style lang="scss" scoped>
::v-deep .header-item {
  font-size: 16px !important;
}
::v-deep .row-item {
  font-size: 16px !important;
}
</style>
src/views/kanbanManager/zpcj.vue
@@ -17,55 +17,134 @@
          <span>{{ headTime }}</span>
        </div>
      </div>
      <div
        style=" padding:5px 20px 20px 20px;z-index:2;height: 940px;flex-direction: column;justify-content: space-between;"
      >
        <!--        ä¸Šè¾¹-->
        <div style="display: flex;justify-content: space-between">
          <div style="width:100%">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§ä¿¡æ¯
            </div>
            <div style="height: 450px">
              <dv-border-box-12>
                <dv-scroll-board
                  ref="scrollBoardTop"
                  :config="configTableTop"
                  style="width: 99%;height: 430px;margin:0 auto;padding-top: 13px;"
                />
              </dv-border-box-12>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 1000px;">
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="blcs" class="svg_class" />
              è´¨é‡ä¸è‰¯(近一周)
              é‡‡è´­è®¢å•(月/å­£)
            </div>
            <div
              class="lineContent horn"
              style="height: 450px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div style="height: 180px;padding: 10px;display: flex;justify-content: space-between">
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl03" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
                <div v-for="i in LeftTopData01" :key="i.Quarter" class="flex_c_s">
                  <div class="all_block03 flex_c_s">
                    <div class="flex_c_c all_block04">{{ i.Quarter }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.quantity }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">入库数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.ouquantity }}</div>
                    </div>
                  </div>
            </div>
          </div>
          <div style="width: 850px;">
              <div style="height: 260px;">
                <div id="all02_1" class="flex_c_c" style="width: 100%;height:100%;" />
              </div>
            </div>
          </div>
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="cggz" class="svg_class" />
              é”€å”®è®¢å•(月/å­£)
            </div>
            <div
              class="lineContent horn"
              style="height: 450px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div style="height: 180px;padding: 10px;display: flex;justify-content: space-between">
                <div v-for="i in RightTopData01" :key="i.Quarter" class="flex_c_s">
                  <div class="all_block03 flex_c_s">
                    <div class="flex_c_c all_block04">{{ i.Quarter }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.quantity }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block04 flex_c_c" style="width: 49% ">出库数</div>
                      <div class="all_block04 flex_c_c" style="width: 49% ">{{ i.ouquantity }}</div>
                    </div>
                  </div>
                </div>
              </div>
              <div style="height: 260px;">
                <div id="all02" class="flex_c_c" style="width: 100%;height:100%;" />
              </div>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§å®Œå·¥(当月)
            </div>
            <div
              class="lineContent horn"
              style="height: 380px;display: flex;flex-direction: column;justify-content: space-between"
            >
              <div
                style="padding: 10px;
                display: flex;justify-content: flex-start;
                flex-wrap: wrap;"
              >
                <div v-for="i in LeftBottomData01" :key="i.wkshp_code" style="margin:0 18px" class="flex_c_s">
                  <div class="all_block01 flex_c_s">
                    <div class="flex_c_c all_block02" style="">{{ i.wkshp_name }}</div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block02 flex_c_c" style="width: 49% ">任务数</div>
                      <div class="all_block02 flex_c_c" style="width: 49% ">{{ i.plan_qty }}</div>
                    </div>
                    <div class="" style="display: flex;justify-content:space-between">
                      <div class="all_block02 flex_c_c" style="width: 49% ">完工数</div>
                      <div class="all_block02 flex_c_c" style="width: 49% ">{{ i.good_qty }}</div>
                    </div>
                  </div>
                </div>
              </div>
              <!--              <div style="height: 260px;">-->
              <!--                <div id="all01" class="flex_c_c" style="width: 100%;height:100%;" />-->
              <!--              </div>-->
            </div>
          </div>
          <div style="width: 925px;">
            <div class="smallTitle">
              <svg-icon icon-class="ckkc" class="svg_class" />
              ä¸è‰¯ç»Ÿè®¡(近一月)
              ä»“库库存
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl04" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            <div class="lineContent horn" style="height: 380px;display: flex;justify-content: space-between">
              <div style="display: flex;justify-content: center;position: relative">
                <div class="kb_center_block_children all_block05">
                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.Y) }}</div>
                  <div class="box02" />
                  <div>原材料</div>
                </div>
                <!--                <div class="kb_center_block_children all_block06">-->
                <!--                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.B) }}</div>-->
                <!--                  <div class="box02" />-->
                <!--                  <div>半成品</div>-->
                <!--                </div>-->
                <div class="kb_center_block_children all_block07">
                  <div style="font-size: 24px;">{{ parseFloat(RightBottom.C) }}</div>
                  <div class="box02" />
                  <div>产成品</div>
                </div>
              </div>
            </div>
          </div>
        </div>
@@ -76,11 +155,9 @@
<script>
import './kbCommon.css'
import { loadEcharts, cjzl04, cjzl03_2, cjzl03 } from '@/utils/myEcharts'
import { loadEcharts, all02, all03 } from '@/utils/myEcharts'
import {
  WorkShopProduceBottomLeftData,
  WorkShopProduceBottomRightData,
  WorkShopProduceTopData
  WorkShopCompreLeftBottom, WorkShopCompreLeftTop, WorkShopCompreRightBottom, WorkShopCompreRightTop
} from '@/api/kanbanManager'
export default {
@@ -88,150 +165,163 @@
  data() {
    return {
      headTime: '',
      tableDataRightTop: [],
      cjzl03_xData: [],
      cjzl03_yData: [],
      RightBottom: [],
      LeftTopData01: [],
      LeftTopData02: [],
      configTableTop: {
        headerBGC: 'rgba(38, 68 ,139, 0.2)', // è¡¨å¤´èƒŒæ™¯è‰²
        oddRowBGC: 'transparent', // å¥‡æ•°è¡ŒèƒŒæ™¯è‰²
        evenRowBGC: 'transparent', // å¶æ•°è¡ŒèƒŒæ™¯è‰²
        headerHeight: 45,
        waitTime: 3000,
        rowNum: 8,
      RightTopData01: [],
      RightTopData02: [],
        header: [
          '<span style="color:#09d8f2;">工单号</span>',
          '<span style="color:#09d8f2;">产品编码</span>',
          '<span style="color:#09d8f2;">产品名称</span>',
          '<span style="color:#09d8f2;">产品规格</span>',
          '<span style="color:#09d8f2;">任务数量</span>',
          '<span style="color:#09d8f2;">合格数量</span>',
          '<span style="color:#09d8f2;">不良数量</span>',
      LeftBottomData01: [],
      LeftBottomData02: [],
          '<span style="color:#09d8f2;">工序顺序</span>',
          '<span style="color:#09d8f2;">工序编码</span>',
          '<span style="color:#09d8f2;">工序名称</span>',
          '<span style="color:#09d8f2;">完成进度(%)</span>'
        ],
        // '<span style="color:#09d8f2;">工废数量</span>',
        // '<span style="color:#09d8f2;">料废数量</span>',
        data: [
          // ['<span style="color:#37a2da;">行1列1</span>', '行1列2', '行1列3'],
        ],
        // index: true, , 130, 130
        columnWidth: [200, 140, 350, 350, 130, 130, 130, 130, 130, 130, 130],
        align: ['center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center']
        // carousel: 'page'
      }
      RightBottom: {}
    }
  },
  created() {
    setInterval(this.getNowTime, 1000)
    // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    // // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    setInterval(() => {
      window.location.reload()
    }, 1000 * 60 * 120)
  },
  async mounted() {
    await this.getWorkShopProduceTopData()
    setInterval(() => {
      this.getWorkShopProduceTopData()
    }, 10 * 1000)
    await this.getWorkShopProduceBottomLeftData()
    setInterval(() => {
      this.getWorkShopProduceBottomLeftData()
    }, 20 * 1000)
    await this.getWorkShopProduceBottomRightData()
    setInterval(() => {
      this.getWorkShopProduceBottomRightData()
    }, 30 * 1000)
  mounted() {
    this.getAllApi()
  },
  methods: {
    async getWorkShopProduceTopData() {
      WorkShopProduceTopData({ wkshopcode: '004' }).then(res => {
        const flag = this.compareArrays(this.configTableTop.data, res.data)
        if (!flag) {
          this.configTableTop.data = res.data.map(i =>
            [
              i.wo_code,
              i.partcode,
              i.partname,
              i.partspec ? i.partspec : '/',
              i.plan_qty,
              i.good_qty,
              `<span style="color: red;">${i.ng_qty}</span>`,
              i.seq,
              i.step_code,
              i.step_name,
              parseFloat(i.schedule.toFixed(2))
    async getAllApi() {
      // å·¦ä¸Š é‡‡è´­è®¢å•
      const res2 = await WorkShopCompreLeftBottom()
      res2.data.BottomLeftTop.forEach(i => {
        this.LeftTopData01.push({
          Quarter: i.Quarter,
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      res2.data.BottomLeftBottom.forEach(i => {
        this.LeftTopData02.push({
          Month: i.Month + '月',
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      loadEcharts('all02_1', all02(this.LeftTopData02, '每月采购数量/入库数量'))
      setInterval(() => {
        this.LeftTopData01 = []
        this.LeftTopData02 = []
        WorkShopCompreLeftBottom().then(res2 => {
          res2.data.BottomLeftTop.forEach(i => {
            this.LeftTopData01.push({
              Quarter: i.Quarter,
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          res2.data.BottomLeftBottom.forEach(i => {
            this.LeftTopData02.push({
              Month: i.Month + '月',
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          loadEcharts('all02_1', all02(this.LeftTopData02, '每月采购数量/入库数量'))
        })
      }, 1000 * 35)
      // å³ä¸Š é”€å”®è®¢å•
      const res3 = await WorkShopCompreRightTop()
      res3.data.RightTop.forEach(i => {
        this.RightTopData01.push({
          Quarter: i.Quarter,
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      res3.data.RightBottom.forEach(i => {
        this.RightTopData02.push({
          Month: i.Month + '月',
          quantity: i.quantity,
          ouquantity: i.ouquantity
        })
      })
      loadEcharts('all02', all02(this.RightTopData02, '每月订单数量/出库数量'))
      setInterval(() => {
        WorkShopCompreRightTop().then(res3 => {
          this.RightTopData01 = []
          this.RightTopData02 = []
          res3.data.RightTop.forEach(i => {
            this.RightTopData01.push({
              Quarter: i.Quarter,
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          res3.data.RightBottom.forEach(i => {
            this.RightTopData02.push({
              Month: i.Month + '月',
              quantity: i.quantity,
              ouquantity: i.ouquantity
            })
          })
          loadEcharts('all02', all02(this.RightTopData02, '每月订单数量/出库数量'))
        })
      }, 1000 * 40)
      const temp2 = [
        { wkshp_code: '004', wkshp_name: '装配车间' }
            ]
          )
          // `<span style="color: red;">${i.laborbad_qty}</span>`,
          // `<span style="color: red;">${i.materielbad_qty}</span>`,
          this.$refs['scrollBoardTop'].updateRows(this.configTableTop.data)
      // å·¦ä¸‹ ç”Ÿäº§è®¢å•
      const res4 = await WorkShopCompreLeftTop({ wkshopcode: temp2.map(i => i.wkshp_code).join(',') })
      for (const res4Key in res4.data.LeftTop) {
        const data = {
          good_qty: 0,
          plan_qty: 0,
          wkshp_code: '',
          wkshp_name: ''
        }
        data.good_qty = res4.data.LeftTop[res4Key][0].good_qty
        data.plan_qty = res4.data.LeftTop[res4Key][0].plan_qty
        data.wkshp_code = res4.data.LeftTop[res4Key][0].wkshp_code
        data.wkshp_name = temp2.find(i => i.wkshp_code === data.wkshp_code).wkshp_name
        this.LeftBottomData01.push(data)
      }
      setInterval(() => {
        WorkShopCompreLeftTop({ wkshopcode: temp2.map(i => i.wkshp_code).join(',') }).then(res2 => {
          this.LeftBottomData01 = []
          this.LeftBottomData02 = []
          for (const res4Key in res4.data.LeftTop) {
            const data = {
              good_qty: 0,
              plan_qty: 0,
              wkshp_code: '',
              wkshp_name: ''
            }
            data.good_qty = res2.data.LeftTop[res4Key][0].good_qty
            data.plan_qty = res2.data.LeftTop[res4Key][0].plan_qty
            data.wkshp_code = res2.data.LeftTop[res4Key][0].wkshp_code
            data.wkshp_name = temp2.find(i => i.wkshp_code === data.wkshp_code).wkshp_name
            this.LeftBottomData01.push(data)
        }
      })
    },
    async getWorkShopProduceBottomLeftData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
      }, 1000 * 30)
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '004', name: '装配车间' }
      ]
      const res4 = await WorkShopProduceBottomLeftData({ wkshopcode: temp.map(i => i.code).join(',') })
      // this.cjzl03_xData = res4.data['101,001'].map(i => i.click_date)
      // this.cjzl03_yData = res4.data['101,001'].map(i => i.count)
      const a = res4.data['004'].map(i => i.click_date) // echarts横坐标
      const b = temp.map(i => i.name)// legendData值
      const c = [
        // res4.data['01'].map(i => i.count),
        // res4.data['02'].map(i => i.count),
        // res4.data['03'].map(i => i.count),
        // res4.data['04'].map(i => i.count),
        // res4.data['05'].map(i => i.count)
        res4.data['004'].map(i => i.count)
      ]// çºµåæ ‡å€¼
      loadEcharts('cjzl03', cjzl03(a, b, c))
    },
    async getWorkShopProduceBottomRightData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '004', name: '装配车间' }
      ]
      const res5 = await WorkShopProduceBottomRightData({ wkshopcode: temp.map(i => i.code).join(',') })
      // å³ä¸‹ ä»“库库存
      const res5 = await WorkShopCompreRightBottom()
      this.RightBottom = res5.data
      if (this.RightBottom.length > 0) {
        loadEcharts('cjzl04', cjzl04(this.RightBottom.map(i => i.name), this.RightBottom.map(i => i.cont)))
      }
    },
      setInterval(() => {
        WorkShopCompreRightBottom().then(res5 => {
          this.RightBottom = res5.data
        })
      }, 1000 * 60)
    },
    // èŽ·å–å½“å‰æ—¶é—´
    getNowTime() {
      const dt = new Date()
@@ -248,23 +338,25 @@
      this.headTime = `${y}-${m}-${d}  ${hh}:${mm}:${ss}   ${week}`
    },
    // ä¸¤ä¸ªæ•°ç»„做对比
    compareArrays(arr1, arr2) {
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      if (set1.size !== set2.size) {
        return false
    headerCellStyle() {
      return {
        backgroundColor: 'transparent ',
        padding: '10px 0',
        textAlign: 'center',
        color: '#07acc2',
        border: 'none',
        fontSize: '20px'
      }
      for (const value of set1) {
        if (!set2.has(value)) {
          return false
    },
    cellStyle() {
      return {
        padding: '7px 0',
        textAlign: 'center',
        backgroundColor: 'transparent ',
        color: '#c7e7ff',
        border: 'none',
        fontSize: '20px'
        }
      }
      return true
    }
  }
@@ -273,13 +365,120 @@
</script>
<style lang="scss" scoped>
::v-deep .header-item {
  font-size: 16px !important;
$main_color: #09d8f2;
$color01: #00FFFF;
.tableData {
  background: transparent;
}
::v-deep .row-item {
  font-size: 16px !important;
.el-table::before {
  height: 0;
}
.el-table__empty-text {
  color: $main_color;
}
.tableDataCell {
  ::v-deep .cell {
    padding: 0 2px;
  }
}
::v-deep .el-table__body-wrapper::-webkit-scrollbar {
  /* width: 0;宽度为0暗藏 */
  width: 0;
  background: transparent;
}
::v-deep .el-table th,
::v-deep .el-table tr,
::v-deep .el-table td {
  background-color: transparent;
}
.all_block01 {
  width: 187px;
  height: 180px;
}
.all_block02 {
  width: 100%;
  height: 49px;
  background: rgba(9, 216, 242, 0.1);
}
.all_block03 {
  width: 199px;
  height: 180px;
}
.all_block04 {
  width: 100%;
  height: 49px;
  background: rgba(9, 216, 242, 0.1);
}
.kb_center_block_children {
  height: 180px;
  //border: 1px solid $kbBorderColor;
  width: 240px;
  display: flex;
  z-index: 2;
  justify-content: space-around;
  align-items: center;
  flex-direction: column;
  margin: 10px;
  font-size: 22px;
  .box02 {
    background: url("../../assets/images/box02.png") no-repeat;
    transform: scale(1.5);
    width: 145px;
    height: 84px;
  }
}
.all_block05 {
  position: absolute;
  animation: upDown 3s ease-in-out infinite;
  left: 170px;
}
//.all_block06 {
//  position: absolute;
//  animation: upDown2 3s ease-in-out infinite;
//  left: 320px;
//}
.all_block07 {
  position: absolute;
  animation: upDown2 3s ease-in-out infinite;
  left: 470px;
}
@keyframes upDown {
  0% {
    top: 50px;
  }
  50% {
    top: 100px;
  }
  100% {
    top: 50px;
  }
}
@keyframes upDown2 {
  0% {
    top: 100px;
  }
  50% {
    top: 50px;
  }
  100% {
    top: 100px;
  }
}
</style>
src/views/kanbanManager/zpcj_back.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,285 @@
<template>
  <div>
    <div class="kb_dashboard" style="display:flex;flex-direction: column;justify-content: space-between">
      <div class="kb_backgroundCustom" />
      <div class="kb_header">
        <div class="kb_headTime" style="top: 35px;left:  20px">
          <span>浙江阿鲁克健身器材有限公司</span>
        </div>
        <div class="kb_headTime kb_header_text" style="top: 35px;left:  800px">
          <span>装配车间数字化看板</span>
        </div>
        <div class="kb_headTime" style="top: 35px;right:  25px">
          <span>{{ headTime }}</span>
        </div>
      </div>
      <div
        style=" padding:5px 20px 20px 20px;z-index:2;height: 940px;flex-direction: column;justify-content: space-between;"
      >
        <!--        ä¸Šè¾¹-->
        <div style="display: flex;justify-content: space-between">
          <div style="width:100%">
            <div class="smallTitle">
              <svg-icon icon-class="cxjg" class="svg_class" />
              ç”Ÿäº§ä¿¡æ¯
            </div>
            <div style="height: 450px">
              <dv-border-box-12>
                <dv-scroll-board
                  ref="scrollBoardTop"
                  :config="configTableTop"
                  style="width: 99%;height: 430px;margin:0 auto;padding-top: 13px;"
                />
              </dv-border-box-12>
            </div>
          </div>
        </div>
        <!--        ä¸‹è¾¹-->
        <div style="display: flex;justify-content: space-between;margin-top: 15px;">
          <div style="width: 1000px;">
            <div class="smallTitle">
              <svg-icon icon-class="blcs" class="svg_class" />
              è´¨é‡ä¸è‰¯(近一周)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl03" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
          <div style="width: 850px;">
            <div class="smallTitle">
              <svg-icon icon-class="ckkc" class="svg_class" />
              ä¸è‰¯ç»Ÿè®¡(近一月)
            </div>
            <div style="height: 380px;">
              <dv-border-box-12>
                <div id="cjzl04" class="flex_c_c" style="width: 100%;height:100%" />
              </dv-border-box-12>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import './kbCommon.css'
import { loadEcharts, cjzl04, cjzl03_2, cjzl03 } from '@/utils/myEcharts'
import {
  WorkShopProduceBottomLeftData,
  WorkShopProduceBottomRightData,
  WorkShopProduceTopData
} from '@/api/kanbanManager'
export default {
  name: 'Cjsc',
  data() {
    return {
      headTime: '',
      cjzl03_xData: [],
      cjzl03_yData: [],
      RightBottom: [],
      configTableTop: {
        headerBGC: 'rgba(38, 68 ,139, 0.2)', // è¡¨å¤´èƒŒæ™¯è‰²
        oddRowBGC: 'transparent', // å¥‡æ•°è¡ŒèƒŒæ™¯è‰²
        evenRowBGC: 'transparent', // å¶æ•°è¡ŒèƒŒæ™¯è‰²
        headerHeight: 45,
        waitTime: 3000,
        rowNum: 8,
        header: [
          '<span style="color:#09d8f2;">工单号</span>',
          '<span style="color:#09d8f2;">产品编码</span>',
          '<span style="color:#09d8f2;">产品名称</span>',
          '<span style="color:#09d8f2;">产品规格</span>',
          '<span style="color:#09d8f2;">任务数量</span>',
          '<span style="color:#09d8f2;">合格数量</span>',
          '<span style="color:#09d8f2;">不良数量</span>',
          '<span style="color:#09d8f2;">工序顺序</span>',
          '<span style="color:#09d8f2;">工序编码</span>',
          '<span style="color:#09d8f2;">工序名称</span>',
          '<span style="color:#09d8f2;">完成进度(%)</span>'
        ],
        // '<span style="color:#09d8f2;">工废数量</span>',
        // '<span style="color:#09d8f2;">料废数量</span>',
        data: [
          // ['<span style="color:#37a2da;">行1列1</span>', '行1列2', '行1列3'],
        ],
        // index: true, , 130, 130
        columnWidth: [200, 140, 350, 350, 130, 130, 130, 130, 130, 130, 130],
        align: ['center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center']
        // carousel: 'page'
      }
    }
  },
  created() {
    setInterval(this.getNowTime, 1000)
    // ä¸¤å°æ—¶çœ‹æ¿åˆ·æ–°ä¸€æ¬¡
    setInterval(() => {
      window.location.reload()
    }, 1000 * 60 * 120)
  },
  async mounted() {
    await this.getWorkShopProduceTopData()
    setInterval(() => {
      this.getWorkShopProduceTopData()
    }, 10 * 1000)
    await this.getWorkShopProduceBottomLeftData()
    setInterval(() => {
      this.getWorkShopProduceBottomLeftData()
    }, 20 * 1000)
    await this.getWorkShopProduceBottomRightData()
    setInterval(() => {
      this.getWorkShopProduceBottomRightData()
    }, 30 * 1000)
  },
  methods: {
    async getWorkShopProduceTopData() {
      WorkShopProduceTopData({ wkshopcode: '004' }).then(res => {
        const flag = this.compareArrays(this.configTableTop.data, res.data)
        if (!flag) {
          this.configTableTop.data = res.data.map(i =>
            [
              i.wo_code,
              i.partcode,
              i.partname,
              i.partspec ? i.partspec : '/',
              i.plan_qty,
              i.good_qty,
              `<span style="color: red;">${i.ng_qty}</span>`,
              i.seq,
              i.step_code,
              i.step_name,
              parseFloat(i.schedule.toFixed(2))
            ]
          )
          // `<span style="color: red;">${i.laborbad_qty}</span>`,
          // `<span style="color: red;">${i.materielbad_qty}</span>`,
          this.$refs['scrollBoardTop'].updateRows(this.configTableTop.data)
        }
      })
    },
    async getWorkShopProduceBottomLeftData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '004', name: '装配车间' }
      ]
      const res4 = await WorkShopProduceBottomLeftData({ wkshopcode: temp.map(i => i.code).join(',') })
      // this.cjzl03_xData = res4.data['101,001'].map(i => i.click_date)
      // this.cjzl03_yData = res4.data['101,001'].map(i => i.count)
      const a = res4.data['004'].map(i => i.click_date) // echarts横坐标
      const b = temp.map(i => i.name)// legendData值
      const c = [
        // res4.data['01'].map(i => i.count),
        // res4.data['02'].map(i => i.count),
        // res4.data['03'].map(i => i.count),
        // res4.data['04'].map(i => i.count),
        // res4.data['05'].map(i => i.count)
        res4.data['004'].map(i => i.count)
      ]// çºµåæ ‡å€¼
      loadEcharts('cjzl03', cjzl03(a, b, c))
    },
    async getWorkShopProduceBottomRightData() {
      const temp = [
        // { code: '101', name: '发泡车间' },
        // { code: '102', name: '挤出车间' },
        // { code: '103', name: '包装车间' },
        // { code: '001', name: '测试车间' }
        // { code: '01', name: '金工车间' },
        // { code: '02', name: '铝修' },
        // { code: '03', name: '台钻' },
        // { code: '04', name: '喷漆' },
        // { code: '05', name: '组装成品' }
        { code: '004', name: '装配车间' }
      ]
      const res5 = await WorkShopProduceBottomRightData({ wkshopcode: temp.map(i => i.code).join(',') })
      this.RightBottom = res5.data
      if (this.RightBottom.length > 0) {
        loadEcharts('cjzl04', cjzl04(this.RightBottom.map(i => i.name), this.RightBottom.map(i => i.cont)))
      }
    },
    // èŽ·å–å½“å‰æ—¶é—´
    getNowTime() {
      const dt = new Date()
      const wk = dt.getDay()
      const y = dt.getFullYear()
      const m = (dt.getMonth() + 1 + '').padStart(2, '0')
      const d = (dt.getDate() + '').padStart(2, '0')
      const hh = (dt.getHours() + '').padStart(2, '0')
      const mm = (dt.getMinutes() + '').padStart(2, '0')
      const ss = (dt.getSeconds() + '').padStart(2, '0')
      const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
      const week = weeks[wk]
      this.headTime = `${y}-${m}-${d}  ${hh}:${mm}:${ss}   ${week}`
    },
    // ä¸¤ä¸ªæ•°ç»„做对比
    compareArrays(arr1, arr2) {
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      if (set1.size !== set2.size) {
        return false
      }
      for (const value of set1) {
        if (!set2.has(value)) {
          return false
        }
      }
      return true
    }
  }
}
</script>
<style lang="scss" scoped>
::v-deep .header-item {
  font-size: 16px !important;
}
::v-deep .row-item {
  font-size: 16px !important;
}
</style>
src/views/statistic/reportList.vue
@@ -1,11 +1,658 @@
<template />
<template>
  <div>
    <div class="body" :style="{height:mainHeight+'px'}">
      <div class="bodyTopButtonGroup">
        <el-button v-waves type="primary" icon="el-icon-download" @click="download">导出</el-button>
      </div>
      <div class="bodyTopFormGroup">
        <el-form
          ref="form"
          :model="form"
          label-width="100px"
          inline
          style="display: flex;"
        >
          <div class="elForm">
            <el-form-item label="车间名称" style=" display: flex;">
              <el-select
                v-model="form.wkshopcode"
                filterable
                :popper-append-to-body="false"
                style="width: 200px"
                placeholder="请选择"
              >
                <el-option
                  v-for="item in wkshopcodeArr"
                  :key="item.torg_code"
                  :label="item.torg_name"
                  :value="item.torg_code"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="工单编号" style=" display: flex;">
              <el-input v-model="form.wocode" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item label="产品编码" style=" display: flex;">
              <el-input v-model="form.partnumber" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item label="产品名称" style=" display: flex;">
              <el-input v-model="form.partname" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="规格型号" style=" display: flex;">
              <el-input v-model="form.partspec" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="工序名称" style=" display: flex;">
              <el-input v-model="form.stepname" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="报工设备" style=" display: flex;">
              <el-select
                v-model="form.eqpcode"
                filterable
                :popper-append-to-body="false"
                style="width: 200px"
                placeholder="请选择"
              >
                <el-option
                  v-for="item in eqpArr"
                  :key="item.code"
                  :label="item.name"
                  :value="item.code"
                />
              </el-select>
              <!--              <el-input v-model="form.eqpcode" style="width: 200px" placeholder="请输入" />-->
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="报工人员" style=" display: flex;">
              <el-input v-model="form.reportuser" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="报工时间" style="display: flex;align-items: center">
              <el-date-picker
                v-model="form.reportdate"
                type="daterange"
                range-separator="~"
                class="timeMini"
                size="mini"
                style="width: 200px;display: flex;line-height: 34px;height: 34px;"
                :clearable="false"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
              />
              <!--              font-size: 14px!important;-->
              <!--              :picker-options="expireTimeOption"-->
            </el-form-item>
          </div>
          <div
            class="bodySearchReset"
            :style="{marginLeft:$store.state.app.sidebar.opened? $store.state.settings.menuIsHorizontal?'15%':'3%':'10%'}"
          >
            <el-button v-waves type="primary" icon="el-icon-search" @click="search">查询</el-button>
            <el-button v-waves type="info" icon="el-icon-refresh" @click="reset">重置</el-button>
          </div>
        </el-form>
        <div
          class="bodyTopFormExpand"
        >
          <svg-icon
            v-show="mouseHoverType==='mouseout'"
            style="cursor: pointer"
            :icon-class="!isExpandForm?'doubleDown3':'doubleUp3'"
            @mouseenter="mouseHoverType=$event.type"
          />
          <svg-icon
            v-show="mouseHoverType==='mouseenter'"
            style="cursor: pointer"
            :icon-class="!isExpandForm?'doubleDown':'doubleUp'"
            @click="isExpandForm=!isExpandForm"
            @mouseout="mouseHoverType=$event.type"
          />
        </div>
      </div>
      <div class="elTableDiv">
        <el-table
          ref="tableDataRef"
          class="tableFixed"
          :data="tableData"
          :height="isExpandForm?tableHeight:(tableHeight+80)+'px'"
          border
          :row-class-name="tableRowClassName"
          :style="{width: 100+'%',height:isExpandForm?tableHeight:(tableHeight+80)+'px',}"
          highlight-current-row
          :header-cell-style="this.$headerCellStyle"
          :cell-style="this.$cellStyle"
          @sort-change="sortChange"
        >
          <el-table-column
            prop="rowNum"
            width="50"
            fixed
            label="序号"
          />
          <el-table-column
            prop="wo_code"
            label="报工工单"
            sortable="custom"
            min-width="160"
            show-overflow-tooltip
          />
          <el-table-column
            prop="partnumber"
            label="产品编码"
            show-overflow-tooltip
            sortable="custom"
            min-width="110"
          />
          <el-table-column
            prop="partname"
            label="产品名称"
            sortable="custom"
            show-overflow-tooltip
            min-width="110"
          />
          <el-table-column
            prop="wkshp_name"
            label="车间名称"
            sortable="custom"
            show-overflow-tooltip
            min-width="110"
          />
          <el-table-column
            prop="task_qty"
            label="任务数量"
            sortable="custom"
            show-overflow-tooltip
            min-width="110"
          />
          <!--          <el-table-column-->
          <!--            prop="wkshp_name"-->
          <!--            label="车间名称"-->
          <!--            show-overflow-tooltip-->
          <!--            sortable="custom"-->
          <!--            min-width="110"-->
          <!--          />-->
          <!--          <el-table-column-->
          <!--            prop="eqp_name"-->
          <!--            label="设备名称"-->
          <!--            sortable="custom"-->
          <!--            show-overflow-tooltip-->
          <!--            min-width="110"-->
          <!--          />-->
          <el-table-column
            prop="stepname"
            label="工序名称"
            show-overflow-tooltip
            sortable="custom"
            min-width="110"
          />
          <!--          <el-table-column-->
          <!--            prop="step_price"-->
          <!--            label="工序单价"-->
          <!--            show-overflow-tooltip-->
          <!--            sortable="custom"-->
          <!--            min-width="110"-->
          <!--          />-->
          <el-table-column
            prop="steptype"
            label="工序类型"
            show-overflow-tooltip
            sortable="custom"
            min-width="110"
          >
            <template slot-scope="{row}">
              {{ row.steptype === 'Z' ? '自制' : '外协' }}
            </template>
          </el-table-column>
          <el-table-column
            prop="wx_name"
            label="设备/供应商"
            show-overflow-tooltip
            sortable="custom"
            min-width="125"
          >
            <template slot-scope="{row}">
              {{ row.steptype === 'Z' ?(row.eqp_name?row.eqp_name:'/'): row.wx_name }}
            </template>
          </el-table-column>
          <el-table-column
            prop="usergroup_name"
            label="报工班组"
            show-overflow-tooltip
            min-width="110"
            sortable="custom"
          >
            <template slot-scope="{row}">
              {{ row.usergroup_name ? row.usergroup_name : '/' }}
            </template>
          </el-table-column>
          <el-table-column
            prop="usercode"
            label="人员编码"
            show-overflow-tooltip
            min-width="110"
            sortable="custom"
          />
          <el-table-column
            prop="username"
            label="报工人员"
            show-overflow-tooltip
            min-width="110"
            sortable="custom"
          />
          <el-table-column
            prop="report_qty"
            label="合格数量"
            show-overflow-tooltip
            sortable="custom"
            min-width="110"
          />
          <el-table-column
            prop="ng_qty"
            label="不良数量"
            show-overflow-tooltip
            min-width="110"
            sortable="custom"
          />
          <el-table-column
            prop="laborbad_qty"
            label="工废数量"
            min-width="110"
            show-overflow-tooltip
            sortable="custom"
          />
          <el-table-column
            prop="materielbad_qty"
            label="料废数量"
            show-overflow-tooltip
            min-width="110"
            sortable="custom"
          />
          <el-table-column
            prop="report_date"
            label="报工时间"
            min-width="160"
            show-overflow-tooltip
            sortable="custom"
          />
        </el-table>
      </div>
      <!--分页-->
      <pagination
        :total="total"
        :page.sync="form.page"
        :limit.sync="form.rows"
        align="right"
        layout="total,prev, pager, next,sizes"
        popper-class="select_bottom"
        @pagination="getMesOrderStepReportSearch"
      />
    </div>
    <el-dialog
      v-el-drag-dialog
      :title="operation==='add'?'新增':'人员明细'"
      :visible.sync="dialogVisible"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      @closed="handleClose"
      @close="handleClose"
    >
      <div style="height: 300px;width: 100%;background-color: aliceblue;padding:20px">
        <el-tag
          v-for="tag in tagArr"
          :key="tag.name"
          type="success"
          style="margin-right: 15px;min-width: 80px;text-align: center"
        >
          {{ tag }}
        </el-tag>
      </div>
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button v-waves @click="dialogVisible=false">返 å›ž</el-button>
          <!--          <el-button v-waves  @click="dialogVisibleCancel">取 æ¶ˆ</el-button>-->
          <!--          <el-button v-waves  type="primary" @click="dialogVisibleConfirm">ç¡® å®š</el-button>-->
        </div>
      </span>
    </el-dialog>
    <!--导入组件-->
    <import-picker
      ref="importPickerFunc"
      class="importPickerClass"
      :shows.sync="shows"
      :title="title_value"
      :colos="colos"
      :code="code"
    />
  </div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { getCookie } from '@/utils/auth'
import ImportPicker from '@/components/ImportPicker'
import { handleDatetime, validateCode } from '@/utils/global'
import {
  GroupSalaryReportSearchUser, MesOrderStepReportExcelSearch, MesOrderStepReportSearch
} from '@/api/ReportManager'
import elDragDialog from '@/directive/el-drag-dialog'
import waves from '@/directive/waves'
import { EqpPermissions, PrentOrganizationNoCompany } from '@/api/GeneralBasicData'
export default {
  name: 'ReportList'
  name: 'Zzjg',
  components: {
    Pagination, ImportPicker
  },
  directives: { elDragDialog, waves },
  data() {
    return {
      mouseHoverType: 'mouseout',
      isExpandForm: false,
      mainHeight: 0,
      tableHeight: 0,
      form: {
        wkshopcode: '',
        wocode: '', // å·¥å•编号
        partnumber: '', // äº§å“ç¼–码
        partname: '', // äº§å“åç§°
        partspec: '', // è§„格型号
        stepname: '', // å·¥åºåç§°
        style: '', // æ“ä½œç±»åž‹
        eqpcode: '', // ç¼ºé™·åç§°
        reportuser: '', // æ“ä½œäººå‘˜
        reportdate: '', // æ“ä½œæ—¶é—´
        prop: 'report_date', // æŽ’序字段
        order: 'desc', // æŽ’序字段
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
      },
      styleArr: [
        { code: 'B', name: '报工' },
        { code: 'S', name: '收料' }
      ],
      // groupArr: [],
      wkshopcodeArr: [],
      total: 10,
      tableData: [],
      dialogVisible: false,
      tagArr: [], //
      dialogForm: {
        OrgType: '',
        OrgCode: '',
        OrgName: '',
        SupUnit: ''// ä¸Šçº§å•位
      },
      operation: '',
      dialogFormRules: {
        OrgType: [
          { required: true, message: '请输入选择类型', trigger: ['blur', 'change'] }
        ],
        OrgCode: [
          { required: true, validator: validateCode, trigger: ['blur', 'change'] }
        ],
        OrgName: [
          { required: true, message: '请输入名称', trigger: ['blur', 'change'] }
        ]
      },
      eqpArr: [],
      title_value: '数据导入 / ç‚¹æ£€éƒ¨ä½',
      code: '4',
      shows: false
    }
  },
  watch: {
    shows() {
      if (!this.shows) {
        this.getMesOrderStepReportSearch()
      }
    }
  },
  created() {
    this.handleRequest()
  },
  mounted() {
    window.addEventListener('resize', this.getHeight)
    this.getHeight()
  },
  methods: {
    handleRequest() {
      this.getMesOrderStepReportSearch().then(res => {
        if (res.code === '200') {
          this.getPrentOrganizationNoCompany()
          this.getEqpPermissions()
        }
      })
    },
    async getEqpPermissions() {
      const { data: res4 } = await EqpPermissions() // è®¾å¤‡
      this.eqpArr = res4
    },
    async getPrentOrganizationNoCompany() {
      const { data: res } = await PrentOrganizationNoCompany()
      this.wkshopcodeArr = res
    },
    async getMesOrderStepReportSearch() {
      let tempDate = this.form.reportdate
      if (tempDate.length > 0) {
        tempDate = handleDatetime(tempDate[0]) + '~' + handleDatetime(tempDate[1])
      }
      const data = {
        wkshopcode: this.form.wkshopcode,
        wocode: this.form.wocode,
        partnumber: this.form.partnumber,
        partname: this.form.partname,
        partspec: this.form.partspec,
        stepname: this.form.stepname,
        eqpcode: this.form.eqpcode,
        reportuser: this.form.reportuser,
        reportdate: tempDate,
        prop: this.form.prop,
        order: this.form.order,
        page: this.form.page,
        rows: this.form.rows
      }
      const res = await MesOrderStepReportSearch(data)
      this.tableData = res.data
      this.total = res.count
      return { code: res.code }
    },
    // async getMesOrderStepReportSelectUserGroup() {
    //   const { data: res } = await MesOrderStepReportSelectUserGroup()
    //   this.groupArr = res
    // },
    // æŽ’序改变时
    sortChange({ column, prop, order }) {
      if (order === 'descending') {
        order = 'desc'
      } else if (order === 'ascending') {
        order = 'asc'
      } else {
        order = 'desc'
      }
      this.form.order = order
      this.form.prop = prop
      this.getMesOrderStepReportSearch()
    },
    async download() {
      let tempDate = this.form.reportdate
      if (tempDate.length > 0) {
        tempDate = handleDatetime(tempDate[0]) + '~' + handleDatetime(tempDate[1])
      }
      const data = {
        wkshopcode: this.form.wkshopcode,
        wocode: this.form.wocode,
        partnumber: this.form.partnumber,
        partname: this.form.partname,
        partspec: this.form.partspec,
        stepname: this.form.stepname,
        eqpcode: this.form.eqpcode,
        reportuser: this.form.reportuser,
        reportdate: tempDate
      }
      const { data: res } = await MesOrderStepReportExcelSearch(data)
      window.location.href = res
    },
    // æŸ¥è¯¢
    search() {
      this.getMesOrderStepReportSearch()
    },
    // å¯¼å…¥æŒ‰é’®
    upload() {
      this.shows = true
      this.$refs.importPickerFunc.newDataFunc()
    },
    colos() {
      this.shows = false
    },
    // é‡ç½®
    reset() {
      this.form.wkshopcode = ''
      this.form.wocode = ''
      this.form.partnumber = ''
      this.form.partname = ''
      this.form.partspec = ''
      this.form.stepname = ''
      this.form.eqpcode = ''
      this.form.reportuser = ''
      this.form.reportdate = ''
      this.getMesOrderStepReportSearch()
    },
    // æ–°å¢žæŒ‰é’®
    add(operation) {
      this.operation = operation
      this.dialogVisible = true
    },
    // ä¿®æ”¹æŒ‰é’®
    async edit(operation, row) {
      this.operation = operation
      this.dialogVisible = true
      const res = await GroupSalaryReportSearchUser({ id: row.id })
      this.tagArr = res.data.map(r => r.reportuser)
      // this.tagArr = ['楼李俊', '张三', '李四']
      // this.$nextTick(() => {
      //   this.dialogForm.OrgCode = row.org_code
      //   this.dialogForm.OrgName = row.org_name
      //   this.dialogForm.SupUnit = row.parent_id
      // })
    },
    // åˆ é™¤æŒ‰é’®
    async del(row) {
      // this.$confirm('是否确认删除?', '提示', {
      //   confirmButtonText: '确定',
      //   cancelButtonText: '取消',
      //   type: 'warning'
      // }).then(() => {
      //   DeleteOrganization({ orgid: row.code }).then(res => {
      //     if (res.code === '200') {
      //       this.$message.success('删除成功!')
      //       if (this.form.page > 1 && this.tableData.length === 1) {
      //         this.form.page--
      //       }
      //       this.getMesOrderStepReportSearch()
      //     }
      //   })
      // }).catch(() => {
      //   this.$message.info('已取消删除')
      // })
    },
    // å¯¹è¯æ¡†å…³é—­äº‹ä»¶
    handleClose() {
      this.dialogForm.OrgType = ''
      this.dialogForm.OrgCode = ''
      this.dialogForm.OrgName = ''
      this.dialogForm.SupUnit = ''
      this.$refs.dialogForm.clearValidate()
    },
    // å¯¹è¯æ¡†å–消
    dialogVisibleCancel() {
      this.dialogVisible = false
    },
    // å¯¹è¯æ¡†ç¡®è®¤
    dialogVisibleConfirm() {
      this.$refs.dialogForm.validate(valid => {
        if (valid) {
          const data = {
            OrganCode: this.dialogForm.OrgCode,
            OrganName: this.dialogForm.OrgName,
            OperType: this.operation === 'add' ? 'Add' : 'Update',
            Operator: getCookie('admin')
          }
          // AddUpdateOrganization(data).then(res => {
          //   if (res.code === '200') {
          //     this.$message.success(this.operation === 'add' ? '添加成功!' : '修改成功!')
          //     this.dialogVisible = false
          //     this.getMesOrderStepReportSearch()
          //   } else {
          //     this.$message.error(this.operation === 'add' ? '添加失败!' : '修改失败!')
          //   }
          // })
        }
      })
    },
    // èŽ·å–é¡µé¢é«˜åº¦
    getHeight() {
      this.$nextTick(() => {
        this.mainHeight = window.innerHeight - 85
        this.tableHeight = this.mainHeight - 295
        this.$refs.tableDataRef.doLayout()
      })
    },
    tableRowClassName({ row, rowIndex }) {
      return 'custom-row'
    }
  }
}
</script>
<style scoped>
<style scoped lang="scss">
::v-deep .el-select__caret {
  display: flex;
  align-items: center;
  justify-content: center;
}
::v-deep .el-range__icon {
  line-height: 28px !important;
}
::v-deep .el-range-separator {
  line-height: 28px !important;
}
::v-deep .el-range-input {
  font-size: 14px;
}
::v-deep .el-range-separator {
  display: flex;
  justify-content: center;
  align-items: center;
}
::v-deep .el-progress-bar__innerText{
  display: none !important;
}
</style>
<style>
.el-table .custom-row {
  background: #f8f8fa;
}
</style>