|
@@ -51,6 +51,7 @@
|
|
<el-menu-item index="1-29" v-if="permissions.takCompletedStatus" @click="ssl(28)"><p>{{ $t('yuanGongRenWuWanChengQingKuangBiao') }}</p></el-menu-item>
|
|
<el-menu-item index="1-29" v-if="permissions.takCompletedStatus" @click="ssl(28)"><p>{{ $t('yuanGongRenWuWanChengQingKuangBiao') }}</p></el-menu-item>
|
|
<el-menu-item index="1-30" v-if="permissions.taskPlanCost" @click="ssl(29)"><p>{{ $t('taskPlanCostReport') }}</p></el-menu-item>
|
|
<el-menu-item index="1-30" v-if="permissions.taskPlanCost" @click="ssl(29)"><p>{{ $t('taskPlanCostReport') }}</p></el-menu-item>
|
|
<el-menu-item index="1-31" v-if="permissions.reportFTEPlanAll || permissions.reportFTEPlanPart" @click="ssl(30)"><p>FTE计划报表</p></el-menu-item>
|
|
<el-menu-item index="1-31" v-if="permissions.reportFTEPlanAll || permissions.reportFTEPlanPart" @click="ssl(30)"><p>FTE计划报表</p></el-menu-item>
|
|
|
|
+ <el-menu-item index="1-32" v-if="permissions.reportMonthlyFinancialWorkSchedule" @click="ssl(31)"><p>月度财务工时表</p></el-menu-item>
|
|
</el-submenu>
|
|
</el-submenu>
|
|
</el-menu>
|
|
</el-menu>
|
|
</el-col>
|
|
</el-col>
|
|
@@ -231,15 +232,56 @@
|
|
<el-select v-if="ins == 5" multiple v-model="stageNames" @visible-change="visibleSelcts" @clear="visibleSelcts(false)" clearable size="small" filterable collapse-tags :placeholder="$t('pleaseselectstage')" style="margin-left:10px;">
|
|
<el-select v-if="ins == 5" multiple v-model="stageNames" @visible-change="visibleSelcts" @clear="visibleSelcts(false)" clearable size="small" filterable collapse-tags :placeholder="$t('pleaseselectstage')" style="margin-left:10px;">
|
|
<el-option v-for="item in firstStages" :key="item" :label="item" :value="item"></el-option>
|
|
<el-option v-for="item in firstStages" :key="item" :label="item" :value="item"></el-option>
|
|
</el-select>
|
|
</el-select>
|
|
|
|
+
|
|
|
|
+ <!-- 月度财务报表单独筛选条件 -->
|
|
|
|
+ <template v-if="ins == 31">
|
|
|
|
+ <div class="monthlyFinance">
|
|
|
|
+ <div class="monthlyFinance-item">
|
|
|
|
+ <el-date-picker v-model="obtainMonthlyFinancialStatementsYmonth" type="month" placeholder="选择月" :clearable="false" @change="selcts()" size="small" value-format="yyyy-MM" style="width: 160px"></el-date-picker>
|
|
|
|
+ <el-button size="small" style="margin-left: 15px;" @click="getObtainMonthlyFinancialStatements(1)">重置工时</el-button>
|
|
|
|
+ <el-tooltip class="item" effect="dark" placement="bottom">
|
|
|
|
+ <div slot="content">
|
|
|
|
+ 以当月人工填报工时进行统计,公共工时自动分摊 <br/><br/>
|
|
|
|
+ 部门A填报的公共工时分摊算法: <br/>
|
|
|
|
+ 1.部门A有本部门工时(车间组装/维修工时)的情况下,以本部门的各个项目工单行号为一组,按照每组的工时占比进行分摊到该组上。 注意:本部门工时不含其他部门协作的工时。<br/>
|
|
|
|
+ 2.部门A没有本部门工时的情况下,部门A有协作其他部门的工时,将部门A的公共工时按其他协作部门(可能有多个)的占比分给其他部门,再按照其他部门的每组工时占比分到该部门的各个组上。<br/>
|
|
|
|
+ </div>
|
|
|
|
+ <el-link type="warning" :underline="false" style="margin-left: 15px;">查看说明</el-link>
|
|
|
|
+ </el-tooltip>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="monthlyFinance-item">
|
|
|
|
+ 工单结算日期{{ obtainMonthlyFinancialModificationDate ? '(修改日期)' : '' }}:
|
|
|
|
+ <template v-if="!obtainMonthlyFinancialModificationDate">
|
|
|
|
+ {{ obtainMonthlyFinancialStatementsRows.timesheetDate }}
|
|
|
|
+ <el-link type="primary" :underline="false" style="margin-left: 15px;" @click="modificationDate()">修改日期</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <el-date-picker v-model="obtainMonthlyFinancialsRowsDates" type="date" placeholder="选择日期" value-format="yyyy-MM-dd" size="small" :clearable="false" style="margin-right: 15px;width: 160px"></el-date-picker>
|
|
|
|
+ <el-button size="small" @click="obtainMonthlyFinancialModificationDate = false">取消</el-button>
|
|
|
|
+ <el-button type="primary" size="small" @click="modificationDateClick()">确定</el-button>
|
|
|
|
+ </template>
|
|
|
|
+ </div>
|
|
|
|
+ <div style="width: 10%;"></div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
</div>
|
|
</div>
|
|
<!-- <p :style="ins == 9 ? 'float: right;margin-right: 25px;width:20%' : 'float: right;margin-right: 25px;width:10%'" > -->
|
|
<!-- <p :style="ins == 9 ? 'float: right;margin-right: 25px;width:20%' : 'float: right;margin-right: 25px;width:10%'" > -->
|
|
- <p :style="`${ins == 9 || ins == 14 || ins == 21 ? 'width: 20%' : 'width: 10%'}`" class="tableRightBtn">
|
|
|
|
|
|
+ <p :style="`${ins == 9 || ins == 14 || ins == 21 ? 'width: 20%' : 'width: 10%'}`" class="tableRightBtn" v-if="ins != 31">
|
|
<el-button type="primary" :loading="exportReportLoading" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button>
|
|
<el-button type="primary" :loading="exportReportLoading" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button>
|
|
<el-button type="primary" @click="fillAll" size="mini" v-if="ins == 14">{{ $t('quanBuBuZu') }}</el-button>
|
|
<el-button type="primary" @click="fillAll" size="mini" v-if="ins == 14">{{ $t('quanBuBuZu') }}</el-button>
|
|
<el-button type="primary" @click="exportExcelByQuarter" size="mini" v-if="ins == 9 && user.companyId == 876">{{ $t('an-ji-du-dao-chu') }}</el-button>
|
|
<el-button type="primary" @click="exportExcelByQuarter" size="mini" v-if="ins == 9 && user.companyId == 876">{{ $t('an-ji-du-dao-chu') }}</el-button>
|
|
<el-button type="primary" @click="setWarning" size="mini" v-if="ins == 21">{{ $t('sheZhiYuJing') }}</el-button>
|
|
<el-button type="primary" @click="setWarning" size="mini" v-if="ins == 21">{{ $t('sheZhiYuJing') }}</el-button>
|
|
</p>
|
|
</p>
|
|
|
|
|
|
|
|
+ <div v-if="ins == 31" style="width: 15%" class="tableRightBtn">
|
|
|
|
+ <template v-if="!obtainMonthlyFinancialStatementsRows.lastSendTime">
|
|
|
|
+ <el-button type="success" size="small" @click="confirmTheFinalDraft()">确定定稿</el-button>
|
|
|
|
+ <el-button type="primary" size="small" @click="immediateVisableCli()" :disabled="!obtainMonthlyFinancialStatementsRows.timesheetDate">立即发送</el-button>
|
|
|
|
+ </template>
|
|
|
|
+ <el-link type="success" :underline="false" v-else>
|
|
|
|
+ {{ obtainMonthlyFinancialStatementsRows.lastSendTime }} 已发送
|
|
|
|
+ </el-link>
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
<div ref="staff" style="margin: 5px 0px 0px 10px; width: 98%">
|
|
<div ref="staff" style="margin: 5px 0px 0px 10px; width: 98%">
|
|
<div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
|
|
<div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
|
|
@@ -1528,8 +1570,43 @@
|
|
<el-table-column align="center" prop="planHours" label="计划工时" min-width="150"></el-table-column>
|
|
<el-table-column align="center" prop="planHours" label="计划工时" min-width="150"></el-table-column>
|
|
<el-table-column align="center" prop="FTE" :label="'计划FTE(计划工时/当月计划工时基数)'" min-width="250"></el-table-column>
|
|
<el-table-column align="center" prop="FTE" :label="'计划FTE(计划工时/当月计划工时基数)'" min-width="250"></el-table-column>
|
|
</el-table>
|
|
</el-table>
|
|
|
|
+
|
|
|
|
+ <!-- 月度财务工时表 -->
|
|
|
|
+ <el-table v-if="ins == 31" key="31" border :data="obtainMonthlyFinancialStatementsRows.detailList" highlight-current-row v-loading="obtainMonthlyFinancialStatementsLoading" :height="+tableHeight + 50" show-summary :summary-method="monthlyFinancialStatistics" style="width: 100%;" :max-height="+tableHeight + 50">
|
|
|
|
+ <el-table-column prop="projectCode" align="center" label="项目号"></el-table-column>
|
|
|
|
+ <el-table-column prop="extraField4" align="center" label="工单号"></el-table-column>
|
|
|
|
+ <el-table-column prop="extraField5" align="center" label="行号"></el-table-column>
|
|
|
|
+ <el-table-column label="车间组装/维修工时(h)" align="center">
|
|
|
|
+ <el-table-column prop="maintanceTime" align="center" label="组装/维修工时(h)" width="130px">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <el-link type="primary" :underline="false" @click="adjustWorkingHours(scope.row, '组装/维修工时',scope.row.maintanceTime,'maintanceTime')">{{ scope.row.maintanceTime }}</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column prop="debugTime" align="center" label="调试工时(h)" width="120px">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <el-link type="primary" :underline="false" @click="adjustWorkingHours(scope.row, '调试工时',scope.row.debugTime,'debugTime')">{{ scope.row.debugTime }}</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column prop="waitingTime" align="center" label="等料工时(h)" width="120px">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <el-link type="primary" :underline="false" @click="adjustWorkingHours(scope.row, '等料工时',scope.row.waitingTime,'waitingTime')">{{ scope.row.waitingTime }}</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column prop="assistTime" align="center" label="协助工时(h)" width="120px">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <el-link type="primary" :underline="false" @click="adjustWorkingHours(scope.row, '协助工时',scope.row.assistTime,'assistTime')">{{ scope.row.assistTime }}</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column prop="publicTime" align="center" label="公摊工时(h)" width="120px">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <el-link type="primary" :underline="false" @click="adjustWorkingHours(scope.row, '公摊工时',scope.row.publicTime,'publicTime')">{{ scope.row.publicTime }}</el-link>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column prop="totalTime" align="center" label="工时合计(h)" width="120px"></el-table-column>
|
|
|
|
+ </el-table>
|
|
<!--工具条-->
|
|
<!--工具条-->
|
|
- <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21 && tabPosition==0 && tabsType == 'all'">
|
|
|
|
|
|
+ <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21 && tabPosition==0 && tabsType == 'all' && ins != 31">
|
|
<el-pagination
|
|
<el-pagination
|
|
v-if="ins == 12"
|
|
v-if="ins == 12"
|
|
@size-change="groupSizeChange"
|
|
@size-change="groupSizeChange"
|
|
@@ -1873,6 +1950,34 @@
|
|
<el-button @click="otherExpensesVisable = false">关闭</el-button>
|
|
<el-button @click="otherExpensesVisable = false">关闭</el-button>
|
|
</span>
|
|
</span>
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
+
|
|
|
|
+ <!-- 修改工时 -->
|
|
|
|
+ <el-dialog :title="adjustWorkingHoursRow.titleValue" :visible.sync="adjustWorkingHoursVisable" width="680px" top="5.6vh" :before-close="handleClose">
|
|
|
|
+ <div>
|
|
|
|
+ <div class="adjustWorkingHours">
|
|
|
|
+ <div>项目号:{{ adjustWorkingHoursRow.projectCode }}</div>
|
|
|
|
+ <div>工单号: {{ adjustWorkingHoursRow.extraField4 }}</div>
|
|
|
|
+ <div>行号: {{ adjustWorkingHoursRow.extraField5 }}</div>
|
|
|
|
+ </div>
|
|
|
|
+ <el-input-number v-model="adjustWorkingHoursRow.timeValue" controls-position="right" :min="0" style="width: 100%;margin-top:20px;" size="small"></el-input-number>
|
|
|
|
+ </div>
|
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
|
+ <el-button type="primary" @click="adjustWorkingHoursClick()">确定</el-button>
|
|
|
|
+ </span>
|
|
|
|
+ </el-dialog>
|
|
|
|
+
|
|
|
|
+ <!-- 立即发送 -->
|
|
|
|
+ <el-dialog title="立即发送" :visible.sync="immediateVisable" width="680px" top="5.6vh" :before-close="handleClose">
|
|
|
|
+ <div>
|
|
|
|
+ <div class="adjustWorkingHours">
|
|
|
|
+ <div>工单结算日期</div>
|
|
|
|
+ <el-date-picker v-model="immediateDateValue" type="date" placeholder="选择日期" value-format="yyyy-MM-dd" size="small" :clearable="false" style="margin-left: 15px;"></el-date-picker>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
|
+ <el-button type="primary" @click="immediate()">确认发送</el-button>
|
|
|
|
+ </span>
|
|
|
|
+ </el-dialog>
|
|
</section>
|
|
</section>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
@@ -1901,7 +2006,7 @@ export default {
|
|
return {
|
|
return {
|
|
themeColor: getThemeColor(),
|
|
themeColor: getThemeColor(),
|
|
screeningCondition: { // 筛选条件的判断
|
|
screeningCondition: { // 筛选条件的判断
|
|
- project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22, 28, 30], // 项目筛选条件 (不等于)
|
|
|
|
|
|
+ project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22, 28, 30, 31], // 项目筛选条件 (不等于)
|
|
months: [14, 15], // 月份筛选条件 (等于)
|
|
months: [14, 15], // 月份筛选条件 (等于)
|
|
monthRange: [19, 30], // 月份区间筛选条件 (等于)
|
|
monthRange: [19, 30], // 月份区间筛选条件 (等于)
|
|
staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26,28, 30], // 人员筛选条件 (等于)
|
|
staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26,28, 30], // 人员筛选条件 (等于)
|
|
@@ -1965,14 +2070,14 @@ export default {
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), this.$t('ziXiangMuGongShiChengBenBiao'), this.$t('renWuZhongQiBiao'), this.$t('fteBaoBiao'), this.$t('youXiaoGongShiShuaiBiao'), this.$t('xiangMuFenLeiGongShiZhanBiBiao'), this.$t('fenLeiGongShiMingXiBiao'),
|
|
this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), this.$t('ziXiangMuGongShiChengBenBiao'), this.$t('renWuZhongQiBiao'), this.$t('fteBaoBiao'), this.$t('youXiaoGongShiShuaiBiao'), this.$t('xiangMuFenLeiGongShiZhanBiBiao'), this.$t('fenLeiGongShiMingXiBiao'),
|
|
- this.$t('yuanGongXiangMuJinDuBiao'), this.$t('fenZuHaoYongJinDuBiao'), this.$t('xiangMuHaoYongJinDuBiao'), this.$t('yuanGongRenWuJinDuBiao'), this.$t('xiangMuYuGuGongShiBiao'),this.$t('yuanGongRenWuWanChengQingKuangBiao'), this.$t('taskPlanCostReport'), 'FTE计划报表'],
|
|
|
|
|
|
+ this.$t('yuanGongXiangMuJinDuBiao'), this.$t('fenZuHaoYongJinDuBiao'), this.$t('xiangMuHaoYongJinDuBiao'), this.$t('yuanGongRenWuJinDuBiao'), this.$t('xiangMuYuGuGongShiBiao'),this.$t('yuanGongRenWuWanChengQingKuangBiao'), this.$t('taskPlanCostReport'), 'FTE计划报表', '月度财务工时表'],
|
|
|
|
|
|
shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
|
|
shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
|
|
this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), this.$t('ziXiangMuGongShiChengBenBiao'), this.$t('renWuZhongQiBiao'), this.$t('fteBaoBiao'),this.$t('youXiaoGongShiShuaiBiao'), this.$t('xiangMuFenLeiGongShiZhanBiBiao'), this.$t('fenLeiGongShiMingXiBiao'),
|
|
this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), this.$t('ziXiangMuGongShiChengBenBiao'), this.$t('renWuZhongQiBiao'), this.$t('fteBaoBiao'),this.$t('youXiaoGongShiShuaiBiao'), this.$t('xiangMuFenLeiGongShiZhanBiBiao'), this.$t('fenLeiGongShiMingXiBiao'),
|
|
- this.$t('yuanGongXiangMuJinDuBiao'), this.$t('fenZuHaoYongJinDuBiao'), this.$t('xiangMuHaoYongJinDuBiao'), this.$t('yuanGongRenWuJinDuBiao'), this.$t('xiangMuYuGuGongShiBiao'),this.$t('yuanGongRenWuWanChengQingKuangBiao'), this.$t('taskPlanCostReport'), 'FTE计划报表'],
|
|
|
|
|
|
+ this.$t('yuanGongXiangMuJinDuBiao'), this.$t('fenZuHaoYongJinDuBiao'), this.$t('xiangMuHaoYongJinDuBiao'), this.$t('yuanGongRenWuJinDuBiao'), this.$t('xiangMuYuGuGongShiBiao'),this.$t('yuanGongRenWuWanChengQingKuangBiao'), this.$t('taskPlanCostReport'), 'FTE计划报表', '月度财务工时表'],
|
|
|
|
|
|
ins: 10000,
|
|
ins: 10000,
|
|
user: JSON.parse(sessionStorage.user),
|
|
user: JSON.parse(sessionStorage.user),
|
|
@@ -2145,7 +2250,17 @@ export default {
|
|
otherExpensesRow: {
|
|
otherExpensesRow: {
|
|
projectExpenseFeeList: []
|
|
projectExpenseFeeList: []
|
|
},
|
|
},
|
|
- otherExpensesVisable: false
|
|
|
|
|
|
+ otherExpensesVisable: false,
|
|
|
|
+
|
|
|
|
+ obtainMonthlyFinancialStatementsRows: {}, // 月度财务工时表
|
|
|
|
+ obtainMonthlyFinancialStatementsYmonth: this.dayjs(new Date()).format('YYYY-MM'),
|
|
|
|
+ obtainMonthlyFinancialStatementsLoading: false,
|
|
|
|
+ obtainMonthlyFinancialModificationDate: false,
|
|
|
|
+ obtainMonthlyFinancialsRowsDates: '',
|
|
|
|
+ adjustWorkingHoursRow: {},
|
|
|
|
+ adjustWorkingHoursVisable: false,
|
|
|
|
+ immediateVisable: false,
|
|
|
|
+ immediateDateValue: '',
|
|
};
|
|
};
|
|
},
|
|
},
|
|
computed: {},
|
|
computed: {},
|
|
@@ -2315,6 +2430,8 @@ export default {
|
|
if(this.permissions.reportProjectEstimated) {this.ssl(27);this.reportProjectEstimated = '1-28';return} else
|
|
if(this.permissions.reportProjectEstimated) {this.ssl(27);this.reportProjectEstimated = '1-28';return} else
|
|
if(this.permissions.takCompletedStatus) {this.ssl(28);this.takCompletedStatus = '1-29';return} else
|
|
if(this.permissions.takCompletedStatus) {this.ssl(28);this.takCompletedStatus = '1-29';return} else
|
|
if(this.permissions.taskPlanCost) {this.ssl(29);this.takCompletedStatus = '1-30';return} else
|
|
if(this.permissions.taskPlanCost) {this.ssl(29);this.takCompletedStatus = '1-30';return} else
|
|
|
|
+ if(this.permissions.reportFTEPlanAll || this.permissions.reportFTEPlanPart) {this.ssl(30);this.takCompletedStatus = '1-31';return} else
|
|
|
|
+ if(this.permissions.reportMonthlyFinancialWorkSchedule) {this.ssl(31);this.takCompletedStatus = '1-32';return} else
|
|
{this.allWrong = false}
|
|
{this.allWrong = false}
|
|
},
|
|
},
|
|
rowspan(spanArr,position,spanName,dataItem = [],fields=false){
|
|
rowspan(spanArr,position,spanName,dataItem = [],fields=false){
|
|
@@ -2619,7 +2736,7 @@ export default {
|
|
this.getGroupWorktimeAll()
|
|
this.getGroupWorktimeAll()
|
|
},
|
|
},
|
|
getList(e) {
|
|
getList(e) {
|
|
- let noUserList = [16, 17, 18, 19, 20, 21, 22, 24, 25, 26,27,29,30]
|
|
|
|
|
|
+ let noUserList = [16, 17, 18, 19, 20, 21, 22, 24, 25, 26,27,29,30,31]
|
|
if(this.ins == 24) {
|
|
if(this.ins == 24) {
|
|
if(this.tabsType == 'all') {
|
|
if(this.tabsType == 'all') {
|
|
this.rangeDatas = []
|
|
this.rangeDatas = []
|
|
@@ -2719,6 +2836,9 @@ export default {
|
|
if (this.ins == 29) {
|
|
if (this.ins == 29) {
|
|
this.getTaskPlanAndRealCost();
|
|
this.getTaskPlanAndRealCost();
|
|
}
|
|
}
|
|
|
|
+ if (this.ins == 31) {
|
|
|
|
+ this.getObtainMonthlyFinancialStatements();
|
|
|
|
+ }
|
|
},
|
|
},
|
|
exportExcel() {
|
|
exportExcel() {
|
|
var url = "/project";
|
|
var url = "/project";
|
|
@@ -4439,32 +4559,6 @@ export default {
|
|
this.setWarningModal = true
|
|
this.setWarningModal = true
|
|
this.getForewarningTableList()
|
|
this.getForewarningTableList()
|
|
},
|
|
},
|
|
- // 单独封装请求
|
|
|
|
- async postData(urls, param) {
|
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
|
- this.http.post(urls, { ...param },
|
|
|
|
- res => {
|
|
|
|
- if(res.code == 'ok') {
|
|
|
|
- resolve(res)
|
|
|
|
- } else {
|
|
|
|
- this.$message({
|
|
|
|
- message: res.msg,
|
|
|
|
- type: 'error'
|
|
|
|
- })
|
|
|
|
- reject(res)
|
|
|
|
- }
|
|
|
|
- resolve(res)
|
|
|
|
- },
|
|
|
|
- error => {
|
|
|
|
- this.$message({
|
|
|
|
- message: error,
|
|
|
|
- type: "error"
|
|
|
|
- });
|
|
|
|
- reject(error)
|
|
|
|
- }
|
|
|
|
- )
|
|
|
|
- });
|
|
|
|
- },
|
|
|
|
// 获取项目分类工时占比表
|
|
// 获取项目分类工时占比表
|
|
async getProjectWoekScale() {
|
|
async getProjectWoekScale() {
|
|
let params = {
|
|
let params = {
|
|
@@ -4855,7 +4949,161 @@ export default {
|
|
this.postData('/project/getAllMainProject', {}).then((res) => {
|
|
this.postData('/project/getAllMainProject', {}).then((res) => {
|
|
this.projectMainIdList = res.data || []
|
|
this.projectMainIdList = res.data || []
|
|
})
|
|
})
|
|
- }
|
|
|
|
|
|
+ },
|
|
|
|
+ // 获取月度财务工时表
|
|
|
|
+ getObtainMonthlyFinancialStatements(reGenerate = '') {
|
|
|
|
+ this.obtainMonthlyFinancialStatementsLoading = true
|
|
|
|
+ this.postData(`/finance-monthly-worktime/getByMonth`, {
|
|
|
|
+ companyId: this.user.companyId,
|
|
|
|
+ ymonth: this.obtainMonthlyFinancialStatementsYmonth,
|
|
|
|
+ reGenerate: reGenerate
|
|
|
|
+ }).then(res => {
|
|
|
|
+ if(reGenerate) {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: '重置成功',
|
|
|
|
+ type: 'success'
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ this.obtainMonthlyFinancialStatementsRows = {
|
|
|
|
+ ...res.data,
|
|
|
|
+ detailList: (res.data.detailList || []).map(item => {
|
|
|
|
+ const timeFields = ['maintanceTime', 'debugTime', 'waitingTime', 'assistTime', 'publicTime'];
|
|
|
|
+ const totalTime = timeFields.reduce((sum, key) => sum + (item[key] || 0), 0);
|
|
|
|
+ return { ...item, totalTime };
|
|
|
|
+ })
|
|
|
|
+ };
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ this.obtainMonthlyFinancialStatementsLoading = false
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ modificationDate() {
|
|
|
|
+ const { timesheetDate = '' } = this.obtainMonthlyFinancialStatementsRows
|
|
|
|
+ this.obtainMonthlyFinancialsRowsDates = timesheetDate
|
|
|
|
+ this.obtainMonthlyFinancialModificationDate = true
|
|
|
|
+ },
|
|
|
|
+ modificationDateClick() {
|
|
|
|
+ this.postData(`/finance-monthly-worktime/setTimesheetDate`, {
|
|
|
|
+ id: this.obtainMonthlyFinancialStatementsRows.id,
|
|
|
|
+ timesheetDate: this.obtainMonthlyFinancialsRowsDates,
|
|
|
|
+ }).then(res => {
|
|
|
|
+ this.obtainMonthlyFinancialModificationDate = false
|
|
|
|
+ this.getObtainMonthlyFinancialStatements()
|
|
|
|
+ this.$message({
|
|
|
|
+ message: `修改成功`,
|
|
|
|
+ type: 'success'
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ confirmTheFinalDraft() {
|
|
|
|
+ this.$confirm('确定定稿吗?', '', {
|
|
|
|
+ confirmButtonText: '确定',
|
|
|
|
+ cancelButtonText: '取消',
|
|
|
|
+ type: 'warning'
|
|
|
|
+ }).then(() => {
|
|
|
|
+ this.postData(`/finance-monthly-worktime/setStatusFinal`, {
|
|
|
|
+ id: this.obtainMonthlyFinancialStatementsRows.id,
|
|
|
|
+ }).then(res => {
|
|
|
|
+ this.getObtainMonthlyFinancialStatements()
|
|
|
|
+ this.$message({
|
|
|
|
+ message: `操作成功`,
|
|
|
|
+ type: 'success'
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ immediateVisableCli() {
|
|
|
|
+ this.immediateDateValue = JSON.parse(JSON.stringify(this.obtainMonthlyFinancialStatementsRows.timesheetDate))
|
|
|
|
+ console.log(this.immediateDateValue, '<==== 123321')
|
|
|
|
+ this.immediateVisable = true
|
|
|
|
+ },
|
|
|
|
+ immediate() {
|
|
|
|
+ this.postData(`/finance-monthly-worktime/send`, {
|
|
|
|
+ id: this.obtainMonthlyFinancialStatementsRows.id,
|
|
|
|
+ timesheetDate: this.immediateDateValue,
|
|
|
|
+ }).then(res => {
|
|
|
|
+ this.immediateVisable = false
|
|
|
|
+ this.getObtainMonthlyFinancialStatements()
|
|
|
|
+ this.$message({
|
|
|
|
+ message: `发送成功`,
|
|
|
|
+ type: 'success'
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 月度财务统计
|
|
|
|
+ monthlyFinancialStatistics({ columns, data }) {
|
|
|
|
+ const timeFields = ['maintanceTime', 'debugTime', 'waitingTime', 'assistTime', 'publicTime', 'totalTime'];
|
|
|
|
+ const sums = [];
|
|
|
|
+
|
|
|
|
+ columns.forEach((column, index) => {
|
|
|
|
+ const prop = column.property;
|
|
|
|
+
|
|
|
|
+ if (index === 0) {
|
|
|
|
+ sums[index] = '合计';
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (timeFields.includes(prop)) {
|
|
|
|
+ const total = data.reduce((sum, row) => {
|
|
|
|
+ const value = Number(row[prop]);
|
|
|
|
+ return sum + (isNaN(value) ? 0 : value);
|
|
|
|
+ }, 0);
|
|
|
|
+ sums[index] = total.toFixed(2);
|
|
|
|
+ } else {
|
|
|
|
+ sums[index] = '';
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ console.log(sums)
|
|
|
|
+ return sums;
|
|
|
|
+ },
|
|
|
|
+ adjustWorkingHours(row, title = '', value, filed) {
|
|
|
|
+ this.adjustWorkingHoursRow = {
|
|
|
|
+ ...row,
|
|
|
|
+ filed,
|
|
|
|
+ titleValue: title + "(修改)",
|
|
|
|
+ timeValue: Number(value || 0)
|
|
|
|
+ }
|
|
|
|
+ this.adjustWorkingHoursVisable = true
|
|
|
|
+ },
|
|
|
|
+ adjustWorkingHoursClick() {
|
|
|
|
+ const { id, filed = '', timeValue = 0 } = this.adjustWorkingHoursRow
|
|
|
|
+ this.postData(`/finance-monthly-worktime/changeWorktime`, {
|
|
|
|
+ id, [filed]: timeValue,
|
|
|
|
+ }).then(res => {
|
|
|
|
+ this.adjustWorkingHoursVisable = false
|
|
|
|
+ this.getObtainMonthlyFinancialStatements()
|
|
|
|
+ this.$message({
|
|
|
|
+ message: `操作成功`,
|
|
|
|
+ type: 'success'
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 单独封装请求
|
|
|
|
+ async postData(urls, param) {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ this.http.post(urls, { ...param },
|
|
|
|
+ res => {
|
|
|
|
+ if(res.code == 'ok') {
|
|
|
|
+ resolve(res)
|
|
|
|
+ } else {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: res.msg,
|
|
|
|
+ type: 'error'
|
|
|
|
+ })
|
|
|
|
+ reject(res)
|
|
|
|
+ }
|
|
|
|
+ resolve(res)
|
|
|
|
+ },
|
|
|
|
+ error => {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: error,
|
|
|
|
+ type: "error"
|
|
|
|
+ });
|
|
|
|
+ reject(error)
|
|
|
|
+ }
|
|
|
|
+ )
|
|
|
|
+ });
|
|
|
|
+ },
|
|
},
|
|
},
|
|
};
|
|
};
|
|
</script>
|
|
</script>
|
|
@@ -4864,6 +5112,23 @@ export default {
|
|
.themeFontColor {
|
|
.themeFontColor {
|
|
@include font_color("color");
|
|
@include font_color("color");
|
|
}
|
|
}
|
|
|
|
+.monthlyFinance {
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ width: 100%;
|
|
|
|
+ .monthlyFinance-item {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ color: #999999;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+.adjustWorkingHours {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ div {
|
|
|
|
+ margin-right: 20px;
|
|
|
|
+ }
|
|
|
|
+}
|
|
.pagingTable {
|
|
.pagingTable {
|
|
flex: 1 1 0%;
|
|
flex: 1 1 0%;
|
|
overflow: hidden;
|
|
overflow: hidden;
|