This commit is contained in:
SamSys
2025-12-29 17:01:12 +03:30
4 changed files with 102 additions and 30 deletions

View File

@@ -19,7 +19,7 @@ jobs:
- name: Setup .NET SDK - name: Setup .NET SDK
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: '8.0.x' dotnet-version: '10.0.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore ServiceHost/ServiceHost.csproj run: dotnet restore ServiceHost/ServiceHost.csproj
@@ -33,9 +33,18 @@ jobs:
shell: powershell shell: powershell
run: | run: |
$publishFolder = Resolve-Path ./publish $publishFolder = Resolve-Path ./publish
$server = $env:SERVER_HOST
$user = $env:DEPLOY_USER
$pass = $env:DEPLOY_PASSWORD
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` & "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
-verb:sync ` -verb:sync `
-source:contentPath="$publishFolder" ` -source:contentPath="$publishFolder" `
-dest:contentPath="dadmehrg",computerName="https://171.22.24.15:8172/msdeploy.axd?site=dadmehrg",userName="Administrator",password="R",authType="Basic" ` -dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=dadmehrg",userName="$user",password="$pass",authType="Basic" `
-allowUntrusted ` -allowUntrusted `
-enableRule:AppOffline -enableRule:AppOffline
env:
SERVER_HOST: ${{ secrets.DEV_HOST }}
DEPLOY_USER: ${{ secrets.DEV_USER }}
DEPLOY_PASSWORD: ${{ secrets.DEV_PASS }}

View File

@@ -0,0 +1,52 @@
using System.Linq;
using GozareshgirProgramManager.Application._Common.Interfaces;
using GozareshgirProgramManager.Application._Common.Models;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
using Microsoft.EntityFrameworkCore;
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoUpdateDeployStatus;
public record AutoUpdateDeployStatusCommand : IBaseCommand;
public class AutoUpdateDeployStatusCommandHandler : IBaseCommandHandler<AutoUpdateDeployStatusCommand>
{
private readonly IProgramManagerDbContext _dbContext;
public AutoUpdateDeployStatusCommandHandler(IProgramManagerDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<OperationResult> Handle(AutoUpdateDeployStatusCommand request,
CancellationToken cancellationToken)
{
// Fetch all sections whose phase is still marked as not completed
var sections = await _dbContext.TaskSections
.Include(ts => ts.Task)
.ThenInclude(t => t.Phase)
.Where(ts => ts.Task.Phase.DeployStatus == ProjectDeployStatus.NoTCompleted)
.ToListAsync(cancellationToken);
if (sections.Count == 0)
return OperationResult.Success();
var phasesToUpdate = sections
.GroupBy(ts => ts.Task.PhaseId)
.Where(g => g.All(s => s.Status == TaskSectionStatus.Completed))
.Select(g => g.First().Task.Phase)
.Distinct()
.ToList();
if (phasesToUpdate.Count == 0)
return OperationResult.Success();
foreach (var phase in phasesToUpdate)
{
phase.UpdateDeployStatus(ProjectDeployStatus.PendingDevDeploy);
}
await _dbContext.SaveChangesAsync(cancellationToken);
return OperationResult.Success();
}
}

View File

@@ -2,6 +2,7 @@
using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application._Common.Models;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.AssignProject; using GozareshgirProgramManager.Application.Modules.Projects.Commands.AssignProject;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoStopOverTimeTaskSections; using GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoStopOverTimeTaskSections;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoUpdateDeployStatus;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeStatusSection; using GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeStatusSection;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject; using GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject;
using GozareshgirProgramManager.Application.Modules.Projects.Commands.DeleteProject; using GozareshgirProgramManager.Application.Modules.Projects.Commands.DeleteProject;
@@ -23,70 +24,75 @@ namespace ServiceHost.Areas.Admin.Controllers.ProgramManager;
public class ProjectController : ProgramManagerBaseController public class ProjectController : ProgramManagerBaseController
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
public ProjectController(IMediator mediator) public ProjectController(IMediator mediator)
{ {
_mediator = mediator; _mediator = mediator;
} }
[HttpGet] [HttpGet]
public async Task<ActionResult<OperationResult<GetProjectsListResponse>>> Get([FromQuery]GetProjectsListQuery query) public async Task<ActionResult<OperationResult<GetProjectsListResponse>>> Get(
[FromQuery] GetProjectsListQuery query)
{ {
var res=await _mediator.Send(query); var res = await _mediator.Send(query);
return res; return res;
} }
[HttpPost] [HttpPost]
public async Task<ActionResult<OperationResult>> Create([FromBody] CreateProjectCommand command) public async Task<ActionResult<OperationResult>> Create([FromBody] CreateProjectCommand command)
{ {
var res=await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
[HttpPut] [HttpPut]
public async Task<ActionResult<OperationResult>> Edit([FromBody] EditProjectCommand command) public async Task<ActionResult<OperationResult>> Edit([FromBody] EditProjectCommand command)
{ {
var res=await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
[HttpDelete] [HttpDelete]
public async Task<ActionResult<OperationResult>> Delete([FromQuery] DeleteProjectCommand command) public async Task<ActionResult<OperationResult>> Delete([FromQuery] DeleteProjectCommand command)
{ {
var res=await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
[HttpGet("assign")] [HttpGet("assign")]
public async Task<ActionResult<OperationResult<GetProjectAssignDetailsResponse>>> GetAssignableProjects(GetProjectAssignDetailsQuery query) public async Task<ActionResult<OperationResult<GetProjectAssignDetailsResponse>>> GetAssignableProjects(
GetProjectAssignDetailsQuery query)
{ {
var res=await _mediator.Send(query); var res = await _mediator.Send(query);
return res; return res;
} }
[HttpPost("assign")] [HttpPost("assign")]
public async Task<ActionResult<OperationResult>> Assign([FromBody] AssignProjectCommand command) public async Task<ActionResult<OperationResult>> Assign([FromBody] AssignProjectCommand command)
{ {
var res=await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
[HttpGet("set-time")] [HttpGet("set-time")]
public async Task<ActionResult<OperationResult<ProjectSetTimeResponse>>> GetSetTimeProjectDetails(ProjectSetTimeDetailsQuery query) public async Task<ActionResult<OperationResult<ProjectSetTimeResponse>>> GetSetTimeProjectDetails(
ProjectSetTimeDetailsQuery query)
{ {
var res=await _mediator.Send(query); var res = await _mediator.Send(query);
return res; return res;
} }
[HttpPost("set-time")] [HttpPost("set-time")]
public async Task<ActionResult<OperationResult>> SetTimeProject([FromBody] SetTimeProjectCommand command) public async Task<ActionResult<OperationResult>> SetTimeProject([FromBody] SetTimeProjectCommand command)
{ {
var res=await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
[HttpPost("change-status")] [HttpPost("change-status")]
public async Task<ActionResult<OperationResult>> ChangeStatus(ChangeStatusSectionCommand command) public async Task<ActionResult<OperationResult>> ChangeStatus(ChangeStatusSectionCommand command)
{ {
var res = await _mediator.Send(command); var res = await _mediator.Send(command);
return res; return res;
} }
@@ -98,14 +104,16 @@ public class ProjectController : ProgramManagerBaseController
} }
[HttpGet("board")] [HttpGet("board")]
public async Task<ActionResult<OperationResult<List<ProjectBoardListResponse>>>> GetProjectBoard([FromQuery] ProjectBoardListQuery query) public async Task<ActionResult<OperationResult<List<ProjectBoardListResponse>>>> GetProjectBoard(
[FromQuery] ProjectBoardListQuery query)
{ {
// اجرای Command برای متوقف کردن تسک‌های overtime قبل از نمایش // اجرای Command برای متوقف کردن تسک‌های overtime قبل از نمایش
await _mediator.Send(new AutoStopOverTimeTaskSectionsCommand()); await _mediator.Send(new AutoStopOverTimeTaskSectionsCommand());
var res = await _mediator.Send(query); var res = await _mediator.Send(query);
return res; return res;
} }
[HttpGet("board/details")] [HttpGet("board/details")]
public async Task<ActionResult<OperationResult<ProjectBoardDetailResponse>>> GetProjectBoardDetails(Guid id) public async Task<ActionResult<OperationResult<ProjectBoardDetailResponse>>> GetProjectBoardDetails(Guid id)
{ {
@@ -117,14 +125,17 @@ public class ProjectController : ProgramManagerBaseController
[HttpGet("deploy-board")] [HttpGet("deploy-board")]
public async Task<ActionResult<OperationResult<GetProjectsDeployBoardListResponse>>> GetProjectDeployBoard() public async Task<ActionResult<OperationResult<GetProjectsDeployBoardListResponse>>> GetProjectDeployBoard()
{ {
// قبل از دریافت دیتا، وضعیت دیپلوی را بر اساس تکمیل شدن تمام سکشن‌ها به‌روزرسانی می‌کنیم
await _mediator.Send(new AutoUpdateDeployStatusCommand());
var request = new GetProjectDeployBoardListQuery(); var request = new GetProjectDeployBoardListQuery();
return await _mediator.Send(request); return await _mediator.Send(request);
} }
[HttpGet("deploy-board/details")]
public async Task<ActionResult<OperationResult<ProjectBoardDetailResponse>>> GetProjectDeployBoardDetails(Guid id) [HttpGet("deploy-board/details")]
{ public async Task<ActionResult<OperationResult<ProjectBoardDetailResponse>>> GetProjectDeployBoardDetails(Guid id)
var query = new ProjectBoardDetailQuery(id); {
var res = await _mediator.Send(query); var query = new ProjectBoardDetailQuery(id);
return res; var res = await _mediator.Send(query);
} return res;
}
} }

View File

@@ -93,7 +93,7 @@
<ul class="submenu"> <ul class="submenu">
<li Permission="@SubAccountPermissionHelper.ContractListPermissionCode"><a class="selectLi" href="https://client@(AppSetting.Value.Domain)/contract-list"><span>لیست قرارداد</span></a></li> <li Permission="@SubAccountPermissionHelper.ContractListPermissionCode"><a class="selectLi" href="https://client@(AppSetting.Value.Domain)/contract-list"><span>لیست قرارداد</span></a></li>
<li Permission="@SubAccountPermissionHelper.CheckoutListPermissionCode"><a class="selectLi" asp-page="/Company/Checkouts/Index"><span>لیست فیش حقوقی</span></a></li> <li Permission="@SubAccountPermissionHelper.CheckoutListPermissionCode"><a class="selectLi" asp-page="/Company/Checkouts/Index"><span>لیست فیش حقوقی</span></a></li>
<li Permission="@SubAccountPermissionHelper.InsuranceListPermissionCode"><a class="selectLi" asp-page="https://client@(AppSetting.Value.Domain)/insurance-list"><span>لیست بیمه</span></a></li> <li Permission="@SubAccountPermissionHelper.InsuranceListPermissionCode"><a class="selectLi" href="https://client@(AppSetting.Value.Domain)/insurance-list"><span>لیست بیمه</span></a></li>
<li Permission="@SubAccountPermissionHelper.PersonnelStatusIndividualReportPermissionCode"><a class="selectLi disable" @*onclick="AjaxUrlContentModal('@Url.Page("/Company/Employees/Index", "ContractCheckoutStatus")');"*@><span>گزارش وضعیت انفرادی پرسنل</span></a></li> <li Permission="@SubAccountPermissionHelper.PersonnelStatusIndividualReportPermissionCode"><a class="selectLi disable" @*onclick="AjaxUrlContentModal('@Url.Page("/Company/Employees/Index", "ContractCheckoutStatus")');"*@><span>گزارش وضعیت انفرادی پرسنل</span></a></li>
<li Permission="@SubAccountPermissionHelper.PersonnelStatusGroupReportPermissionCode"><a class="selectLi disable" @*onclick="AjaxUrlContentModal('@Url.Page("/Company/Workshop/Index", "ContractCheckoutYearlyStatus")');"*@><span>گزارش وضعیت گروهی پرسنل</span></a></li> <li Permission="@SubAccountPermissionHelper.PersonnelStatusGroupReportPermissionCode"><a class="selectLi disable" @*onclick="AjaxUrlContentModal('@Url.Page("/Company/Workshop/Index", "ContractCheckoutYearlyStatus")');"*@><span>گزارش وضعیت گروهی پرسنل</span></a></li>
</ul> </ul>