| | |
| | | prop: "contactPhone", |
| | | width: 150, |
| | | }, |
| | | { |
| | | label: "跟进进度", |
| | | prop: "followUpLevel", |
| | | width: 120, |
| | | }, |
| | | { |
| | | label: "跟进时间", |
| | | prop: "followUpTime", |
| | | width: 120, |
| | | }, |
| | | // { |
| | | // label: "跟进进度", |
| | | // prop: "followUpLevel", |
| | | // width: 120, |
| | | // }, |
| | | // { |
| | | // label: "跟进时间", |
| | | // prop: "followUpTime", |
| | | // width: 120, |
| | | // }, |
| | | { |
| | | label: "银行基本户", |
| | | prop: "basicBankAccount", |
| | |
| | | label: "操作", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 290, |
| | | width: 130, |
| | | operation: [ |
| | | { |
| | | name: "编辑", |
| | |
| | | openForm("edit", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "添加洽谈进度", |
| | | type: "text", |
| | | clickFun: row => { |
| | | openNegotiationDialog(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "回访提醒", |
| | | type: "text", |
| | | clickFun: row => { |
| | | openReminderDialog(row); |
| | | }, |
| | | }, |
| | | // { |
| | | // name: "添加洽谈进度", |
| | | // type: "text", |
| | | // clickFun: row => { |
| | | // openNegotiationDialog(row); |
| | | // }, |
| | | // }, |
| | | // { |
| | | // name: "回访提醒", |
| | | // type: "text", |
| | | // clickFun: row => { |
| | | // openReminderDialog(row); |
| | | // }, |
| | | // }, |
| | | { |
| | | name: "详情", |
| | | type: "text", |
| | |
| | | {{ currentKnowledge.creator }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="创建时间"> |
| | | {{ currentKnowledge.createTime }} |
| | | {{dayjs(currentKnowledge.createTime).format("YYYY-MM-DD")}} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | |
| | | <el-table :data="fileList" style="margin-top: 20px" border> |
| | | <el-table-column prop="fileName" label="文件名" show-overflow-tooltip /> |
| | | <el-table-column prop="fileType" label="文件类型" width="100" /> |
| | | <el-table-column label="向量化状态" width="120"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="getStatusType(row.vectorStatus)"> |
| | | {{ getStatusText(row.vectorStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="chunkCount" label="切片数" width="100" align="center" /> |
| | | <!-- <el-table-column label="向量化状态" width="120">--> |
| | | <!-- <template #default="{ row }">--> |
| | | <!-- <el-tag :type="getStatusType(row.vectorStatus)">--> |
| | | <!-- {{ getStatusText(row.vectorStatus) }}--> |
| | | <!-- </el-tag>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <!-- <el-table-column prop="chunkCount" label="切片数" width="100" align="center" />--> |
| | | <el-table-column label="错误信息" width="200" show-overflow-tooltip> |
| | | <template #default="{ row }"> |
| | | <span v-if="row.vectorError" style="color: #f56c6c">{{ row.vectorError }}</span> |
| | |
| | | import useUserStore from '@/store/modules/user'; |
| | | import { userListNoPageByTenantId } from '@/api/system/user.js'; |
| | | import { getToken } from "@/utils/auth"; |
| | | import dayjs from "dayjs"; |
| | | import { parseDate } from "@/utils/ruoyi"; |
| | | |
| | | // 日期回显格式化(YYYY-MM-DD) |
| | |
| | | width="100" /> |
| | | <el-table-column prop="updateTime" |
| | | label="更新时间" |
| | | width="180" /> |
| | | width="180" > |
| | | <template #default="scope"> |
| | | <el-text> |
| | | {{scope.row.updateTime?dayjs(scope.row.updateTime).format("YYYY-MM-DD"):"--"}} |
| | | </el-text> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="createUserName" |
| | | label="更新人" |
| | | width="120" /> |
| | |
| | | addReadingStatus, |
| | | updateReadingStatus, |
| | | } from "@/api/collaborativeApproval/sealManagement.js"; |
| | | import dayjs from "dayjs"; |
| | | const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue")); |
| | | import { |
| | | listRuleFiles, |
| | |
| | | const viewVersionHistory = row => { |
| | | showVersionHistoryDialog.value = true; |
| | | const params = { |
| | | category: row.category, |
| | | title: row.title, |
| | | }; |
| | | listRuleManagement(page, params).then(res => { |
| | | if (res.code == 200) { |
| | |
| | |
|
| | | <el-table ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
|
| | | <el-table-column type="selection" width="55" align="center" />
|
| | | <el-table-column label="访问编号" align="center" prop="infoId" />
|
| | | <el-table-column label="访问编号" align="center">
|
| | | <template #default="scope">
|
| | | <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
|
| | | </template>
|
| | | </el-table-column>
|
| | | <el-table-column label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
|
| | | <el-table-column label="地址" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
|
| | | <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
|
| | |
| | | <el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" />
|
| | | <el-table-column label="访问时间" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180">
|
| | | <template #default="scope">
|
| | | <span>{{ parseTime(scope.row.loginTime) }}</span>
|
| | | <span>{{ parseDate(scope.row.loginTime) }}</span>
|
| | | </template>
|
| | | </el-table-column>
|
| | | </el-table>
|
| | |
| | |
|
| | | <script setup name="Logininfor">
|
| | | import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/monitor/logininfor"
|
| | | import {parseDate} from "@/utils/ruoyi.js";
|
| | |
|
| | | const { proxy } = getCurrentInstance()
|
| | | const { sys_common_status } = proxy.useDict("sys_common_status")
|
| | |
| | | <el-form-item label="操作时间" style="width: 308px">
|
| | | <el-date-picker
|
| | | v-model="dateRange"
|
| | | value-format="YYYY-MM-DD HH:mm:ss"
|
| | | value-format="YYYY-MM-DD"
|
| | | type="daterange"
|
| | | range-separator="-"
|
| | | start-placeholder="开始日期"
|
| | |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | </el-form-item> |
| | | <el-form-item label="销售合同号:"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | placeholder="请输入" |
| | | clearable |
| | | prefix-icon="Search" |
| | | @change="handleQuery" /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="销售合同号:">--> |
| | | <!-- <el-input v-model="searchForm.salesContractNo"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- clearable--> |
| | | <!-- prefix-icon="Search"--> |
| | | <!-- @change="handleQuery" />--> |
| | | <!-- </el-form-item>--> |
| | | <el-form-item label="项目名称:"> |
| | | <el-input v-model="searchForm.projectName" |
| | | placeholder="请输入" |
| | |
| | | }, |
| | | }); |
| | | const { form, rules } = toRefs(data); |
| | | const { form: searchForm } = useFormData({ |
| | | ...data.searchForm, |
| | | // 设置录入日期范围为当天 |
| | | entryDate: [ |
| | | dayjs().startOf("day").format("YYYY-MM-DD"), |
| | | dayjs().endOf("day").format("YYYY-MM-DD"), |
| | | ], |
| | | entryDateStart: dayjs().startOf("day").format("YYYY-MM-DD"), |
| | | entryDateEnd: dayjs().endOf("day").format("YYYY-MM-DD"), |
| | | }); |
| | | const { form: searchForm } = useFormData(data.searchForm); |
| | | |
| | | // 产品表单弹框数据 |
| | | const productFormVisible = ref(false); |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="typeNum"> |
| | | <div class="typeNum-left"> |
| | | <img src="~@/assets/images/chartCard2.svg" alt="图表" |
| | | style="width: 40px; height: 40px; object-fit: contain;"> |
| | | <div class="typeNum-left-text" style="color: #5EB334;">半成品</div> |
| | | </div> |
| | | <div class="typeNum-center"> |
| | | <div class="typeNum-leftLine2">-</div> |
| | | <div class="typeNum-rightLine2"></div> |
| | | </div> |
| | | <div class="typeNum-right"> |
| | | <div class="typeNum-right-top"> |
| | | <div class="typeNum-right-top-name">总数量</div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'totalCount') }} <span |
| | | class="unit">个</span></div> |
| | | </div> |
| | | <div class="typeNum-right-bottom"> |
| | | <div class="typeNum-right-top-name">已完成数</div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'completedCount') }} <span |
| | | class="unit">个</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- <div class="typeNum">--> |
| | | <!-- <div class="typeNum-left">--> |
| | | <!-- <img src="~@/assets/images/chartCard2.svg" alt="图表"--> |
| | | <!-- style="width: 40px; height: 40px; object-fit: contain;">--> |
| | | <!-- <div class="typeNum-left-text" style="color: #5EB334;">半成品</div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="typeNum-center">--> |
| | | <!-- <div class="typeNum-leftLine2">-</div>--> |
| | | <!-- <div class="typeNum-rightLine2"></div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="typeNum-right">--> |
| | | <!-- <div class="typeNum-right-top">--> |
| | | <!-- <div class="typeNum-right-top-name">总数量</div>--> |
| | | <!-- <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'totalCount') }} <span--> |
| | | <!-- class="unit">个</span></div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="typeNum-right-bottom">--> |
| | | <!-- <div class="typeNum-right-top-name">已完成数</div>--> |
| | | <!-- <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'completedCount') }} <span--> |
| | | <!-- class="unit">个</span>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <div class="typeNum"> |
| | | <div class="typeNum-left"> |
| | | <img src="~@/assets/images/chartCard3.svg" alt="图表" |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="quality-card green-card"> |
| | | <div class="quality-card-title"> |
| | | <img src="~@/assets/images/chartCard2.svg" alt="半成品" |
| | | style="width: 24px; height: 24px; margin-right: 8px;"> |
| | | 半成品合格率 |
| | | </div> |
| | | <div class="quality-card-content"> |
| | | <div class="quality-item"> |
| | | <div> |
| | | <div class="quality-item-label blue-label">完成率</div> |
| | | <div class="quality-item-tip">占比</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(1, 'completionRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" ref="semiCompletionChart"></div> |
| | | </div> |
| | | <div class="quality-item"> |
| | | <div> |
| | | <div class="quality-item-label green-label">合格率</div> |
| | | <div class="quality-item-tip">占比</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(1, 'passRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" ref="semiQualityChart"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- <div class="quality-card green-card">--> |
| | | <!-- <div class="quality-card-title">--> |
| | | <!-- <img src="~@/assets/images/chartCard2.svg" alt="半成品"--> |
| | | <!-- style="width: 24px; height: 24px; margin-right: 8px;">--> |
| | | <!-- 半成品合格率--> |
| | | <!-- </div>--> |
| | | <!-- <div class="quality-card-content">--> |
| | | <!-- <div class="quality-item">--> |
| | | <!-- <div>--> |
| | | <!-- <div class="quality-item-label blue-label">完成率</div>--> |
| | | <!-- <div class="quality-item-tip">占比</div>--> |
| | | <!-- <div class="quality-item-value">{{ getPassRateStatValue(1, 'completionRate') }}</div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="quality-item-chart" ref="semiCompletionChart"></div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="quality-item">--> |
| | | <!-- <div>--> |
| | | <!-- <div class="quality-item-label green-label">合格率</div>--> |
| | | <!-- <div class="quality-item-tip">占比</div>--> |
| | | <!-- <div class="quality-item-value">{{ getPassRateStatValue(1, 'passRate') }}</div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="quality-item-chart" ref="semiQualityChart"></div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <div class="quality-card purple-card"> |
| | | <div class="quality-card-title"> |
| | | <img src="~@/assets/images/chartCard3.svg" alt="成品" |
| | |
| | | <div class="chart-box-title">原材料总数</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(0, 'totalCount') }}</div> |
| | | </div> |
| | | <div class="inspection-chart-box"> |
| | | <div class="chart-box-title">半成品总数</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(1, 'totalCount') }}</div> |
| | | </div> |
| | | <!-- <div class="inspection-chart-box">--> |
| | | <!-- <div class="chart-box-title">半成品总数</div>--> |
| | | <!-- <div class="chart-box-num">{{ getYearlyStatValue(1, 'totalCount') }}</div>--> |
| | | <!-- </div>--> |
| | | <div class="inspection-chart-box"> |
| | | <div class="chart-box-title">成品总数</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(2, 'totalCount') }}</div> |
| | |
| | | <!-- Tab 选择器 --> |
| | | <div class="tab-selector"> |
| | | <div class="tab-item" :class="{ active: activeTab === 'raw' }" @click="activeTab = 'raw'">原材料</div> |
| | | <div class="tab-item" :class="{ active: activeTab === 'semi' }" @click="activeTab = 'semi'">半成品</div> |
| | | <!-- <div class="tab-item" :class="{ active: activeTab === 'semi' }" @click="activeTab = 'semi'">半成品</div>--> |
| | | <div class="tab-item" :class="{ active: activeTab === 'final' }" @click="activeTab = 'final'">成品</div> |
| | | </div> |
| | | </el-card> |
| | |
| | | containLabel: true, |
| | | }, |
| | | legend: { |
| | | data: ["原材料", "半成品", "成品"], // 图例数据 |
| | | // data: ["原材料", "半成品", "成品"], // 图例数据 |
| | | data: ["原材料", "成品"], // 图例数据 |
| | | icon: ["circle", "circle", "circle"], |
| | | itemWidth: 10, // 设置图标宽度 |
| | | itemHeight: 10, |
| | |
| | | color: "#409EFF", |
| | | }, |
| | | }, |
| | | { |
| | | name: "半成品", |
| | | type: "bar", |
| | | barWidth: "15%", |
| | | |
| | | data: monthlyCompletionDetailsData.value.map(item => item.processCount), |
| | | itemStyle: { |
| | | color: "#67C23A", |
| | | }, |
| | | }, |
| | | // { |
| | | // name: "半成品", |
| | | // type: "bar", |
| | | // barWidth: "15%", |
| | | // |
| | | // data: monthlyCompletionDetailsData.value.map(item => item.processCount), |
| | | // itemStyle: { |
| | | // color: "#67C23A", |
| | | // }, |
| | | // }, |
| | | { |
| | | name: "成品", |
| | | type: "bar", |
| | |
| | | radius: "70%", |
| | | data: [ |
| | | { value: getYearlyStatValue(0, 'totalCount'), name: "原材料", itemStyle: { color: "#1890FF" } }, |
| | | { value: getYearlyStatValue(1, 'totalCount'), name: "半成品", itemStyle: { color: "#F7BA1E" } }, |
| | | // { value: getYearlyStatValue(1, 'totalCount'), name: "半成品", itemStyle: { color: "#F7BA1E" } }, |
| | | { value: getYearlyStatValue(2, 'totalCount'), name: "成品", itemStyle: { color: "#14C9C9" } }, |
| | | ], |
| | | label: { |
| | |
| | | }, |
| | | // 图例配置 |
| | | legend: { |
| | | data: ["原材料", "半成品", "成品"], // 图例数据 |
| | | // data: ["原材料", "半成品", "成品"], // 图例数据 |
| | | data: ["原材料", "成品"], // 图例数据 |
| | | icon: ["circle", "circle", "circle"], |
| | | itemWidth: 10, // 设置图标宽度 |
| | | itemHeight: 10, |
| | |
| | | |
| | | .typeNum { |
| | | height: 100%; |
| | | width: 33.33%; |
| | | width: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |